Python检查两个或多个列表是否为列表的子集
我有三个动态生成的列表。其他两个列表是主列表的子集Python检查两个或多个列表是否为列表的子集,python,python-3.x,Python,Python 3.x,我有三个动态生成的列表。其他两个列表是主列表的子集 list_M = ["A", "B", "C" ,"D", "E"] #main list list_X = ["A", "C" , "E"] #subset of main list list_Y = ["A" ,"E"] #subset of both list_X and main_list 我需要做的是检查子列表中的项目是否存在于主列表中,如果它们存在,我想将它们替换为“是”,如果不存在,则
list_M = ["A", "B", "C" ,"D", "E"] #main list
list_X = ["A", "C" , "E"] #subset of main list
list_Y = ["A" ,"E"] #subset of both list_X and main_list
我需要做的是检查子列表中的项目是否存在于主列表中,如果它们存在,我想将它们替换为“是”,如果不存在,则替换为“否”。像这样:
#output
A Yes Yes
B No No
C Yes No
D No No
E Yes Yes
我可以用一堆for和if语句来实现这一点。但是有没有一种更像Python的方式可以使用
Any
和Replace
列表理解是你的朋友:
list_M_x = ['YES' if i in list_X else 'NO' for i in list_M]
list_M_y = ['YES' if i in list_Y else 'NO' for i in list_M]
print(list_M_x) # ['YES', 'NO', 'YES', 'NO', 'YES']
print(list_M_y) # ['YES', 'NO', 'NO', 'NO', 'YES']
正如@tobias_k在评论中所说,如果列表
list_X
和list_Y
很长,您可以通过将它们转换为集合来看到显著的好处,因为集合具有O(1)成员资格测试。列表理解是您的朋友:
list_M_x = ['YES' if i in list_X else 'NO' for i in list_M]
list_M_y = ['YES' if i in list_Y else 'NO' for i in list_M]
print(list_M_x) # ['YES', 'NO', 'YES', 'NO', 'YES']
print(list_M_y) # ['YES', 'NO', 'NO', 'NO', 'YES']
正如@tobias_k在评论中所说,如果列表list_X
和list_Y
很长,您可以通过将它们转换为集合看到显著的好处,因为集合具有O(1)成员测试。您可以这样做:
for l in list_M:
print(f"{l} {'Yes' if l in list_X else 'No'} {'Yes' if l in list_Y else 'No'}")
你可以这样做:
for l in list_M:
print(f"{l} {'Yes' if l in list_X else 'No'} {'Yes' if l in list_Y else 'No'}")
您可以使用方法
issubset
(方法文件)
这是通过将列表强制转换为集合来实现的,因为集合只有唯一的元素
下面是一个示例,说明如何将列表的强制转换为集合:
list_M = ["A", "B", "C" ,"D", "E"] #main list
list_X = ["A", "C" , "E"] #subset of main list
list_Y = ["A" ,"E"]
>>> set(list_M) < set(list_X)
True
list_M=[“A”、“B”、“C”、“D”、“E”]#主列表
列表X=[“A”、“C”、“E”]#主列表的子集
列表_Y=[“A”,“E”]
>>>集合(列表M)<集合(列表X)
真的
您可以使用方法issubset
(方法文件)
这是通过将列表强制转换为集合来实现的,因为集合只有唯一的元素
下面是一个示例,说明如何将列表的强制转换为集合:
list_M = ["A", "B", "C" ,"D", "E"] #main list
list_X = ["A", "C" , "E"] #subset of main list
list_Y = ["A" ,"E"]
>>> set(list_M) < set(list_X)
True
list_M=[“A”、“B”、“C”、“D”、“E”]#主列表
列表X=[“A”、“C”、“E”]#主列表的子集
列表_Y=[“A”,“E”]
>>>集合(列表M)<集合(列表X)
真的