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)
真的