Python 逆幂集生成器
Python inverse power set generator
我正在尝试获得一个逆幂集生成器,一个 returns 幂集从最大到最小的生成器。
这是一个标准的发电机组(见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]
[]
有什么方法可以反转发电机,使其从后面工作吗?
您可以从较大的子集开始。反转选择大小的范围,像这样:
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)
您可以设置标志并反转范围:
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]]
我正在尝试获得一个逆幂集生成器,一个 returns 幂集从最大到最小的生成器。
这是一个标准的发电机组(见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]
[]
有什么方法可以反转发电机,使其从后面工作吗?
您可以从较大的子集开始。反转选择大小的范围,像这样:
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)
您可以设置标志并反转范围:
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]]