识别完全包含在其他列表中的子列表

时间:2017-04-06 13:01:05

标签: python list

我想在列表中找到与另一个列表匹配的子列表,并从中创建一个新列表:

所以我想这样:

Lista = [["a", "b", "c"],["d", "e", "f"]]
Listb = ["b", "c", "d", "e", "f"]

要生成这个:

newvariable = ["d", "e", "f"]

因为abc未包含在listb中,但def

我尝试使用all()进行循环,但似乎无法使它们正常工作?

有什么想法吗?我猜这很简单,我很遗憾。

2 个答案:

答案 0 :(得分:2)

最直接的解决方案是

>>> Lista = [["a", "b", "c"],["d", "e", "f"]]
>>> Listb = ["b", "c", "d", "e", "f"]
>>> set_b = set(Listb)
>>> 
>>> [l for l in Lista if all(x in set_b for x in l)]
[['d', 'e', 'f']]

为您提供了一个列表,其中包含Lista中包含Listb的所有列表。

请注意,我没有使用Listb进行实际的包含检查,而是使用集合set_b,因为集合具有O(1)成员资格检查。 (否则,上述all - 检查将具有二次运行时间。)

我认为Listb中元素的顺序无关紧要。如果有,请澄清。

答案 1 :(得分:0)

在比较元素之前,您可以使用iterations.chain展平数组(或副本)。

然后,您可以将列表转换为具有减号运算符的集合。

第二个解决方案 您可以执行类似的操作来递归枚举列表。     def list_walk(iterable):     if isinstance(iterable,List):         for iterable中的值:             对于list_walk中的子值(可迭代):                 屈服子价值     其他:         产量可迭代

然后使用与上面相同的设置技巧。