列表理解与子列表

时间:2019-08-24 23:56:27

标签: python list-comprehension

假设我有以下列表:

first_list = ['a', 'c', 't', 'k', 'p']
second_list = ['a', 'c']

我想检查first_list是否包含second_list中的所有项目,由于Truea在{中,因此以下列表理解将返回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_lista和子列表(p)中的至少一项,因此它应返回t

我想我可以编写一个函数来解压缩任何子列表,但是我想知道是否有更简单的方法可以通过列表理解来做到这一点?

3 个答案:

答案 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 Falsebool({'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)