4

すべて同じ要素のリストのリストがあるとします (intこの例では s を使用します) 。

[range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]

これらのリストの交点を取得するための適切かつ/または効率的な方法は何ですか (したがって、各リストにあるすべての要素を取得できます)? たとえば、次のようになります。

[0, 12, 24, 36, 48, 60, 72, 84, 96]
4

7 に答える 7

8

交差法を持つセットを使用します。

>>> s = set()
>>> s.add(4)
>>> s.add(5)
>>> s
set([4, 5])
>>> t = set([2, 4, 9])
>>> s.intersection(t)
set([4])

あなたの例では、次のようなもの

>>> data = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
>>> sets = map(set, data)
>>> print set.intersection(*sets)
set([0, 96, 36, 72, 12, 48, 84, 24, 60])
于 2010-05-23T21:31:10.203 に答える
4

組み込みsetモジュールがそのトリックを行うべきだと思います。

>>> elements = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
>>> sets = map(set, elements)
>>> result = list(reduce(lambda x, y: x & y, sets))
>>> print result
[0, 96, 36, 72, 12, 48, 84, 24, 60]
于 2010-05-23T21:27:48.387 に答える
3

それらをセットに変換し、set.intersectionメソッドを使用して、セットのリストを削減します。

xs = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
reduce(set.intersection, [set(x) for x in xs])

reduce任意の iterable を繰り返し処理し、提供された関数を最初の 2 つの要素に適用し、次に結果と次の要素、その結果と次の要素などに適用する関数型プログラミング デバイスです

于 2010-05-23T21:28:14.453 に答える
1

私は自分の質問に答えるつもりです:

lists =  [range(100)[::4],range(100)[::3],range(100)[::2],range(100)[::1]]

out = set(lists[0])
for l in lists[1:]:
    out = set(l).intersection(out)

print out

また

print list(out)
于 2010-05-23T21:30:05.143 に答える
0

それらをセットとして扱い、次を使用できますset.intersection()

lists = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
sets = [set(l) for l in lists]

isect = reduce(lambda x,y: x.intersection(y), sets)
于 2010-05-23T21:28:46.620 に答える
0
l = [range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
l = [set(i) for i in l]
intersect = l[0].intersection(l[1])
for i in l[2:]:
    intersect = intersect.intersection(i)
于 2010-05-23T21:29:44.930 に答える