首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python逆功率集发生器

Python逆功率集发生器
EN

Stack Overflow用户
提问于 2015-12-12 21:42:16
回答 2查看 420关注 0票数 0

我试图得到一个逆功率集发生器,一个从最大到最小的返回功率集的发电机。

下面是一个标准的功率集生成器(请参阅this问题):

代码语言:javascript
复制
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)

这会产生以下结果:

代码语言:javascript
复制
[]
[1]
[2]
[3]
[1, 2]
[1, 3]
[2, 3]
[1, 2, 3]

我在努力做到这一点:

代码语言:javascript
复制
[1, 2, 3]
[1, 2]
[1, 3]
[2, 3]
[1]
[2]
[3]
[]

有什么办法使发电机倒过来使它从后面工作吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-12 21:51:01

您可以设置一个标志并反转范围:

代码语言:javascript
复制
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和chain来列出我认为更好一些的列表:

代码语言:javascript
复制
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))

如果您想要一个空列表,请相应地设置开始和停止:

代码语言:javascript
复制
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]]
票数 3
EN

Stack Overflow用户

发布于 2015-12-12 21:44:51

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

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34245324

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档