一般的な要素を見つけるために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時間を費やした後でも、解決策はまだ私にはわからないので、どんな助けも高く評価されます!
すべてのサブリストの集合交差を探しており、集合演算に使用する必要があるデータ型は集合です。
result = set(p[0])
for s in p[1:]:
result.intersection_update(s)
print result
>>> 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])
なぜだけではないのですか?
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])
reduce(lambda x, y: x & y, (set(i) for i in p))
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]
すべてのサブリストの集合交差を探しており、集合演算に使用する必要があるデータ型は集合です。
_result = set(p[0])
for s in p[1:]:
result.intersection_update(s)
print result
_
ただし、リストには10個のリストという制限があります。これより大きいと、「結果」リストの順序が乱れます。 list(result)
によって「結果」をリストにしたと仮定します。
確実にresult.sort()
を使用して、そのように依存している場合に確実に順序付けられるようにしてください。