我正在试图弄清楚如何比较n个列表以找到共同的元素。 例如:
p=[ [1,2,3],
[1,9,9],
..
..
[1,2,4]
>> print common(p)
>> [1]
现在,如果我知道元素的数量,我可以做比较,如:
for a in b:
for c in d:
for x in y:
...
但如果我不知道p有多少元素,那就无法工作。我看过这个比较两个列表的解决方案 https://stackoverflow.com/a/1388864/1320800
但是花了4个小时试图找到一种递归的方法之后,我仍然没有找到解决方案,所以任何帮助都会受到高度赞赏!
答案 0 :(得分:45)
您正在寻找所有子列表的集合交集,您应该用于集合操作的数据类型是一个集合:
result = set(p[0])
for s in p[1:]:
result.intersection_update(s)
print result
答案 1 :(得分:15)
>>> p=[ [1,2,3],
[1,9,9],
[1,2,4]]
>>> set(p[0]).intersection(*p)
set([1])
答案 2 :(得分:7)
一个简单的解决方案(单行)是:
set.intersection(*[set(list) for list in p])
答案 3 :(得分:6)
为什么不呢:
set.intersection(*map(set, p))
结果:
set([1])
或者像这样:
ip = iter(p)
s = set(next(ip))
s.intersection(*ip)
结果:
set([1])
编辑:
从控制台复制:
>>> p = [[1,2,3], [1,9,9], [1,2,4]]
>>> set.intersection(*map(set, p))
set([1])
>>> ip = iter(p)
>>> s = set(next(ip))
>>> s.intersection(*ip)
set([1])
答案 4 :(得分:2)
reduce(lambda x, y: x & y, (set(i) for i in p))
答案 5 :(得分:1)
p=[ [1,2,3],
[1,9,9],
[1,2,4]]
ans = [ele[0] for ele in zip(*p) if len(set(ele)) == 1]
结果:
>>> ans
[1]
答案 6 :(得分:0)
您正在寻找所有子列表的集合交集,您应该用于集合操作的数据类型是一个集合:
result = set(p[0])
for s in p[1:]:
result.intersection_update(s)
print result
但是,列表中有10个列表的限制。任何更大的原因导致结果'列表无序。假设你已经做出了结果'按list(result)
列入一个列表。
如果你依赖它,请确保result.sort()
确保它已被订购。