假设我有以下列表:
first_list = ['a', 'c', 't', 'k', 'p']
second_list = ['a', 'c']
我想检查first_list
是否包含second_list
中的所有项目,由于True
和a
在{中,因此以下列表理解将返回c
{1}}。
first_list
但是,假设all(i in first_list for i in second_list)
包含一个子列表,例如:
second_list
如何检查first_list = ['a', 'c', 't', 'k', 'p']
second_list = ['a', ['s', 't'], 'p']
是否包含所有个“顶层”项目以及任何个“第二层”(嵌套)项目?< / p>
例如,由于first_list
包含first_list
,a
和子列表(p
)中的至少一项,因此它应返回t
。
我想我可以编写一个函数来解压缩任何子列表,但是我想知道是否有更简单的方法可以通过列表理解来做到这一点?
答案 0 :(得分:1)
first_list = ['a', 'c', 't', 'k', 'p']
second_list = ['a', ['s', 't'], 'p']
first_set = set(first_list)
def matches(e):
return set(e) & first_set if type(e) == list else e in first_set
all(map(matches, second_list))
为什么要set(e) & first_set
?
如果我们要比较两个列表中的元素(或更普遍地说是可迭代的元素),并且不在乎每个元素出现多少次,那么sets是一个不错的选择,部分原因是它们的运算符例如差异-
和交集&
。在这里,我们想知道子列表中的元素和first_list
之间是否存在任何共同点。首先,我们将它们转换为集合。公共性由交集或&
表示,交集从两个集合中返回公共元素。所以在这个例子中,我们有
{'s', 't'} & {'a', 'c', 't', 'k', 'p'} == {'t'}
然后,我使用一个非空集合是真实的事实:bool({}) is False
,bool({'t'}) is True
。
(请注意,map
的计算是延迟的,因此该表达式将在不匹配的第一个元素上停止计算-即,在这方面它与循环理解一样有效。)
答案 1 :(得分:0)
首先解包第二个列表,然后进行比较:
first_list = ['a', 'c', 't', 'k', 'p']
second_list = ['a', ['s', 't'], 'p']
second_list = [item for sublist in second_list for item in sublist]
common = [i for i in set(first_list) if i in set(second_list)]
print common
输出为['a','t','p']
答案 2 :(得分:0)
如果可以使用该集合,则可以有效地解决问题。
first_list = ['a', 'c', 't', 'k', 'p']
second_list = ['a', ['s', 't'], 'p']
first_set = set(first_list)
second_set = [set(item) for item in second_list]
all(item & first_set for item in second_set)