我有一个任意数量的列表列表,例如:
[[1,2,3], [3,4,5], [5,6,7], [7,8,9]]
Run Code Online (Sandbox Code Playgroud)
现在我想要一个包含多个列表中存在的所有元素的列表:
[3,5,7]
Run Code Online (Sandbox Code Playgroud)
我该怎么办?
谢谢!
for*_*ran 12
就像你手工做的一样:
seen = set()
repeated = set()
for l in list_of_lists:
for i in set(l):
if i in seen:
repeated.add(i)
else:
seen.add(i)
Run Code Online (Sandbox Code Playgroud)
顺便说一句,这是一些人正在寻找的一个班轮(不计入进口)(应该比其他方法效率低)
from itertools import *
reduce(set.union, (starmap(set.intersection, combinations(map(set, ll), 2))))
Run Code Online (Sandbox Code Playgroud)
最干净的方法可能是使用reduce:
def findCommon(L):
def R(a, b, seen=set()):
a.update(b & seen)
seen.update(b)
return a
return reduce(R, map(set, L), set())
result = findCommon([[1,2,3], [3,4,5], [5,6,7], [7,8,9]])
Run Code Online (Sandbox Code Playgroud)
结果是一个集合,但是list(result)如果你真的需要一个列表就行.
另一个简单的解决方案(一行):
set.intersection(*[set(list) for list in list_of_lists])
Run Code Online (Sandbox Code Playgroud)