2

私はイテラブル オブジェクトのリストを持っており、各イテラブルから 0 または 1 項目で構成されるすべてのリストを取得することに関心があります (順序は重要ではないため、私が求める順列ではなく組み合わせです)。

以下に投稿した本当に洗練されていない実装があります。

おそらくモジュールを使用して、これを行うはるかにエレガントな方法があると確信していitertoolsますが、何も思いつきません。何かアドバイス?


import itertools


def all_subsets(ss):
    subset_lens = range(0, len(ss) + 1)
    list_of_subsets = map(lambda n: itertools.combinations(ss, n), subset_lens)
    return itertools.chain.from_iterable(list_of_subsets)


list_of_iterables = [["A1"], ["B1", "B2", "B3"], ["C1", "C2"]]

all_possibilities = itertools.chain.from_iterable(itertools.product(*subset)
                                for subset in all_subsets(list_of_iterables))

# Visual representation of the desired result
for eg in all_possibilities:
    print eg

結果:

()
('A1',)
('B1',)
('B2',)
('B3',)
('C1',)
('C2',)
('A1', 'B1')
('A1', 'B2')
('A1', 'B3')
('A1', 'C1')
...
4

2 に答える 2

1

これが私が思いついたものです...

data = [["A1"], ["B1", "B2", "B3"], ["C1", "C2"]]
data = [[None] + x for x in data]
data = sorted(filter(None, x) for x in itertools.product(*data))
for result in data:
    print result

出力:

()
('A1',)
('A1', 'B1')
('A1', 'B1', 'C1')
('A1', 'B1', 'C2')
('A1', 'B2')
('A1', 'B2', 'C1')
('A1', 'B2', 'C2')
('A1', 'B3')
('A1', 'B3', 'C1')
('A1', 'B3', 'C2')
('A1', 'C1')
('A1', 'C2')
('B1',)
('B1', 'C1')
('B1', 'C2')
('B2',)
('B2', 'C1')
('B2', 'C2')
('B3',)
('B3', 'C1')
('B3', 'C2')
('C1',)
('C2',)
于 2013-03-07T20:52:41.447 に答える
1
[filter(None, comb) for comb in itertools.product(*[[None] + it for it in list_of_iterables])]

これにより、いくつかの単純化された仮定が作成されます。iterable にブール値のコンテキストで true でない値が含まれている場合は、より複雑な を使用する必要がありますfilter。イテラブルがリストでない場合は、itertools.chain代わりにを使用する必要があり[None] + itます。

于 2013-03-07T20:52:50.717 に答える