web-dev-qa-db-ja.com

リストのリストから一般的な要素を見つける方法は?

一般的な要素を見つけるために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/13208

しかし、それを再帰的にする方法を理解するために4時間を費やした後でも、解決策はまだ私にはわからないので、どんな助けも高く評価されます!

28
8bits

すべてのサブリストの集合交差を探しており、集合演算に使用する必要があるデータ型は集合です。

result = set(p[0])
for s in p[1:]:
    result.intersection_update(s)
print result
48
Sven Marnach
>>> p=[ [1,2,3],
    [1,9,9],
    [1,2,4]]
>>> set(p[0]).intersection(*p)
set([1])
15

簡単な解決策(1行)は次のとおりです。

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

なぜだけではないのですか?

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])
7
pillmuncher
reduce(lambda x, y: x & y, (set(i) for i in p))
2
Joel Cornett
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]
1
Akavall

すべてのサブリストの集合交差を探しており、集合演算に使用する必要があるデータ型は集合です。

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

ただし、リストには10​​個のリストという制限があります。これより大きいと、「結果」リストの順序が乱れます。 list(result)によって「結果」をリストにしたと仮定します。

確実にresult.sort()を使用して、そのように依存している場合に確実に順序付けられるようにしてください。

0
spearna