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 の要素数がわからない場合、それは機能しません。2つのリストを比較するこのソリューションを見てきました 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 に答える
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 に答える