2

私はリストを言っlis1 = [1,2,3] て、上記のリストのサブセットのリストを言う

lis2 = [[1,2],[2,3],[3],[1],[2]]

lis1 のすべてのアイテムが組み合わせに存在するように、lis2 のすべての組み合わせを生成したいと考えています。

たとえば。これは有効な組み合わせです

そのような組み合わせの 1 つは( ie[[1,2],[2,3]]のすべての項目がその中に存在する) です。lis1[1,2,3]

一方、これはそうではありません

[[1,2],[1],[2]] # (3 is not present in it)

私がしたことは、この関数を介してlis2のパワーセットを生成することでした

from itertools import chain, combinations

def powerset(iterable):
    s = list(iterable)
    return chain.from_iterable(combinations(s, r) for r in range(1,len(s)+1))

しかし、明らかなように、返されるセットには型の組み合わせが含まれています

[[1,2],[1],[2]] # (3 is not present in it)

lis1 のすべてのアイテムを含む組み合わせを確認するにはどうすればよいですか

4

1 に答える 1

1

関数を適用してpowersetサブセットの組み合わせを取得し、結果をフィルタリングできます。

>>> lis1 = [1,2,3]
>>> lis2 = [[1,2],[2,3],[3],[1],[2]]
>>> filter(lambda s: set(sum(s,[])) == set(lis1), powerset(lis2))
[([1, 2], [2, 3]),
 ([1, 2], [3]),
 ([2, 3], [1]),
 ([1, 2], [2, 3], [3]),
 ([1, 2], [2, 3], [1]),
 ([1, 2], [2, 3], [2]),
 ([1, 2], [3], [1]),
 ([1, 2], [3], [2]),
 ([2, 3], [3], [1]),
 ([2, 3], [1], [2]),
 ([3], [1], [2]),
 ([1, 2], [2, 3], [3], [1]),
 ([1, 2], [2, 3], [3], [2]),
 ([1, 2], [2, 3], [1], [2]),
 ([1, 2], [3], [1], [2]),
 ([2, 3], [3], [1], [2]),
 ([1, 2], [2, 3], [3], [1], [2])]

結果のサブセットに要素が重複しないようにする場合は、代わりにこれを使用します。

>>> filter(lambda s: sorted(sum(s,[])) == sorted(lis1), powerset(lis2))
[([1, 2], [3]), ([2, 3], [1]), ([3], [1], [2])]

どちらの方法でも、ネストされたリストをフラット化し、 (すべて存在、重複を無視) または(すべて存在、まったく同じ数)sum(s, [])を使用してそれらを元の要素と比較するために使用します。setsorted

于 2014-07-28T10:21:39.920 に答える