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

8bi*_*its 28 python recursion comparison list

我试图弄清楚如何比较n个列表以找到共同的元素.例如:

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

>> print common(p)
>> [1]
Run Code Online (Sandbox Code Playgroud)

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

for a in b:
  for c in d:
    for x in y:
...
Run Code Online (Sandbox Code Playgroud)

但如果我不知道p有多少元素,那就行不通.我看过这个比较两个列表/sf/answers/97220511/的解决方案

但是花了4个小时试图找到一种方法来实现递归,一个解决方案仍然无法解决,所以任何帮助都将受到高度赞赏!

Sve*_*ach 49

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

result = set(p[0])
for s in p[1:]:
    result.intersection_update(s)
print result
Run Code Online (Sandbox Code Playgroud)

  • +1使用集合,其中集合是适当的数据类型. (4认同)
  • 或者,`result&= s`. (2认同)

Ray*_*ger 15

>>> p=[ [1,2,3],
    [1,9,9],
    [1,2,4]]
>>> set(p[0]).intersection(*p)
set([1])
Run Code Online (Sandbox Code Playgroud)


pil*_*her 8

为什么不呢:

set.intersection(*map(set, p))
Run Code Online (Sandbox Code Playgroud)

结果:

set([1])
Run Code Online (Sandbox Code Playgroud)

或者像这样:

ip = iter(p)
s = set(next(ip))
s.intersection(*ip)
Run Code Online (Sandbox Code Playgroud)

结果:

set([1])
Run Code Online (Sandbox Code Playgroud)

编辑:

从控制台复制:

>>> 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])
Run Code Online (Sandbox Code Playgroud)


Win*_*mes 8

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

set.intersection(*[set(list) for list in p])
Run Code Online (Sandbox Code Playgroud)