关于python:如何在列表列表中查找公共元素?

How to find common elements in list of lists?

我正在尝试找出如何比较n个列表以找到公共元素。例如:

1
2
3
4
5
6
7
8
p=[ [1,2,3],
    [1,9,9],
      ..
      ..
    [1,2,4]

>> print common(p)
>> [1]

现在,如果我知道元素的数量,我可以做如下比较:

1
2
3
4
for a in b:
  for c in d:
    for x in y:
...

但如果我不知道P有多少个元素的话,这是行不通的。我看过这个比较两个列表的解决方案https://stackoverflow.com/a/1388864/1320800

但是在花了4个小时试图找到一种方法来实现递归之后,我仍然没有找到一个解决方案,所以任何帮助都将非常感谢!


您正在查找所有子列表的集合交集,应用于集合操作的数据类型是集合:

1
2
3
4
result = set(p[0])
for s in p[1:]:
    result.intersection_update(s)
print result


1
2
3
4
5
>>> p=[ [1,2,3],
    [1,9,9],
    [1,2,4]]
>>> set(p[0]).intersection(*p)
set([1])


一个简单的解决方案(一行)是:

1
set.intersection(*[set(list) for list in p])

为什么不只是:

1
set.intersection(*map(set, p))

结果:

1
set([1])

或者像这样:

1
2
3
ip = iter(p)
s = set(next(ip))
s.intersection(*ip)

结果:

1
set([1])

编辑:

从控制台复制:

1
2
3
4
5
6
7
>>> 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])


1
reduce(lambda x, y: x & y, (set(i) for i in p))


1
2
3
4
5
p=[ [1,2,3],
    [1,9,9],
    [1,2,4]]

ans = [ele[0] for ele in zip(*p) if len(set(ele)) == 1]

结果:

1
2
>>> ans
[1]


您正在查找所有子列表的集合交集,用于集合操作的数据类型是集合:

1
2
3
4
result = set(p[0])  
for s in p[1:]:
   result.intersection_update(s)
print result

但是,一个列表中有10个列表的限制。任何更大的事情都会导致"结果"列表出现问题。假设你已经把"结果"列入了list(result)的列表中。

如果你依赖它的话,一定要确保你订购了它。