如何在列表列表中查找公共元素?

时间:2012-04-08 21:23:08

标签: python list recursion comparison

我正在试图弄清楚如何比较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个小时试图找到一种递归的方法之后,我仍然没有找到解决方案,所以任何帮助都会受到高度赞赏!

7 个答案:

答案 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()确保它已被订购。