すべて同じ要素のリストのリストがあるとします (int
この例では s を使用します) 。
[range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
これらのリストの交点を取得するための適切かつ/または効率的な方法は何ですか (したがって、各リストにあるすべての要素を取得できます)? たとえば、次のようになります。
[0, 12, 24, 36, 48, 60, 72, 84, 96]
すべて同じ要素のリストのリストがあるとします (int
この例では s を使用します) 。
[range(100)[::4], range(100)[::3], range(100)[::2], range(100)[::1]]
これらのリストの交点を取得するための適切かつ/または効率的な方法は何ですか (したがって、各リストにあるすべての要素を取得できます)? たとえば、次のようになります。
[0, 12, 24, 36, 48, 60, 72, 84, 96]
交差法を持つセットを使用します。
>>> 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])
組み込み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]
それらをセットに変換し、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 つの要素に適用し、次に結果と次の要素、その結果と次の要素などに適用する関数型プログラミング デバイスです。
私は自分の質問に答えるつもりです:
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)
それらをセットとして扱い、次を使用できます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)
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)