0

逆パワー セット ジェネレーター (パワー セットを最大から最小に戻すジェネレーター) を取得しようとしています。

これが標準のパワーセットジェネレーターです(この質問を参照):

from itertools import chain, combinations
def powerset_generator(i):
    for subset in chain.from_iterable(combinations(i, r) for r in range(len(i)+1)):
        yield list(subset)

これが生成されます:

[]
[1]
[2]
[3]
[1, 2]
[1, 3]
[2, 3]
[1, 2, 3]

そして、私はこれを試みています:

[1, 2, 3]
[1, 2]
[1, 3]
[2, 3]
[1]
[2]
[3]
[]

ジェネレーターを逆にして、後ろから作動させる方法はありますか?

4

2 に答える 2

3

フラグを設定して範囲を逆にすることができます。

def powerset_generator(it, rev=False):
    rn = range(len(it), 0, -1) if rev else range(1, len(it)+1)
    for subset in chain.from_iterable(combinations(it, r) for r in rn):
        yield list(subset)

python 3を使用するyield fromと、チェーンの代わりに使用しmapて、少し読みやすいと思うものをリストすることもできます:

def powerset_generator(it, rev=False):
    rn = range(len(it), 0, -1) if rev else range(1, len(it) + 1)
    for r in rn:
        yield from map(list,combinations(it, r))

空のリストが必要な場合は、それに応じて開始と終了を設定します。

In [3]: list(powerset_generator([1, 2, 3]))
Out[3]: [[1], [2], [3], [1, 2], [1, 3], [2, 3], [1, 2, 3]]

In [4]: list(powerset_generator([1, 2, 3],True))
Out[4]: [[1, 2, 3], [1, 2], [1, 3], [2, 3], [1], [2], [3]]
于 2015-12-12T21:51:01.533 に答える
1

より大きなサブセットから始めることができます。次のように、サイズを選択する範囲を逆にします。

from itertools import chain, combinations
def powerset_generator(i):
    for subset in chain.from_iterable(combinations(i, r) for r in range(len(i), -1, -1)):
        yield list(subset)
于 2015-12-12T21:44:51.980 に答える