Python逆功率发生器

时间:2015-12-12 21:42:16

标签: python algorithm powerset

我正在尝试获得一个逆功率发生器,一个从最大到最小返回功率组的发生器。

以下是标准电源设置生成器(请参阅this问题):

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]
[]

有没有办法扭转发电机,使其从后面工作?

2 个答案:

答案 0 :(得分: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]]

答案 1 :(得分:1)

您可以从较大的子集开始。反转选择大小的范围,如下所示:

complex