38

我试图弄清楚如何比较 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 小时试图找到一种方法来实现递归之后,我仍然没有找到一个解决方案,所以任何帮助都将不胜感激!

4

7 回答 7

61

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

result = set(p[0])
for s in p[1:]:
    result.intersection_update(s)
print result
于 2012-04-08T21:25:19.447 回答
21
>>> p=[ [1,2,3],
    [1,9,9],
    [1,2,4]]
>>> set(p[0]).intersection(*p)
set([1])
于 2012-04-08T22:39:13.027 回答
20

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

set.intersection(*[set(list) for list in p])
于 2017-01-09T23:35:15.783 回答
13

为什么不只是:

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])
于 2012-04-08T22:00:06.420 回答
3
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]
于 2012-04-08T21:39:24.460 回答
2
reduce(lambda x, y: x & y, (set(i) for i in p))
于 2012-04-08T21:30:01.320 回答
0

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

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

但是,一个列表中有 10 个列表的限制。任何更大的东西都会导致“结果”列表出现故障。假设您已将“结果”放入列表中list(result)

result.sort()如果您依赖它,请确保您确保它是订购的。

于 2017-08-30T14:24:39.223 回答