我想在列表中找到与另一个列表匹配的子列表,并从中创建一个新列表:
所以我想这样:
Lista = [["a", "b", "c"],["d", "e", "f"]]
Listb = ["b", "c", "d", "e", "f"]
要生成这个:
newvariable = ["d", "e", "f"]
因为a
,b
,c
未包含在listb
中,但d
,e
,f
是
我尝试使用all()
进行循环,但似乎无法使它们正常工作?
有什么想法吗?我猜这很简单,我很遗憾。
答案 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中的子值(可迭代): 屈服子价值 其他: 产量可迭代
然后使用与上面相同的设置技巧。