web-dev-qa-db-ja.com

Python-複数のリストの交差点?

私はpythonで遊んでいて、2つのリストの共通部分を取得できます。

result = set(a).intersection(b)

dabおよび3番目の要素cを含むリストである場合、すべての交点を見つけるための組み込み関数がありますd内の3つのリストたとえば、

d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]

結果は次のようになります

[3,4]
48
Legend

2.4では、交差関数を定義するだけです。

def intersect(*d):
    sets = iter(map(set, d))
    result = sets.next()
    for s in sets:
        result = result.intersection(s)
    return result

pythonの新しいバージョンの場合:

交差法は任意の量の引数を取ります

result = set(d[0]).intersection(*d[:1])

または、最初のセットをそれ自体と交差させて、リストのスライスとコピーの作成を回避できます。

result = set(d[0]).intersection(*d)

pythonに組み込みのチェックがある場合を除き、どちらがより効率的で、d[0]のサイズとリストのサイズに依存するのかという感覚を実際に持っているのように

if s1 is s2:
    return s1

交差法で。

>>> d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]
>>> set(d[0]).intersection(*d)
set([3, 4])
>>> set(d[0]).intersection(*d[1:])
set([3, 4])
>>> 
44
aaronasterling
set.intersection(*map(set,d))

@ user3917838

素晴らしくシンプルですが、それを機能させるためにキャストが必要であり、結果としてリストを提供します。次のようになります。

list(reduce(set.intersection, [set(item) for item in d ]))

どこ:

d = [[1,2,3,4], [2,3,4], [3,4,5,6,7]]

結果は次のとおりです。

[3, 4]

少なくともPython 3.4

4
Bartek

ラムダ削減。

from functools import reduce #you won't need this in Python 2
l=[[1, 2, 3, 4], [2, 3, 4], [3, 4, 5, 6, 7]]
reduce(set.intersection, [set(l_) for l_ in l])
1
user3917838