2015-12-12 81 views
0

我想要得到一個逆功率集發電機,發電機從最大到最小返回功率集。Python的逆功率集發電機

這是一個標準的發電機組發電機(見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] 
[] 

有什麼方法可以將發生器反轉,使其從後面起作用?

回答

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,你也可以在地方鏈和map的使用yield from名單我想讀更好一點:

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]] 
+0

我們的解決方案其實沒有做什麼OP期望:d在同等大小的子集的順序顛倒過來太 –

+0

@hege_hegedus的例子,我想/希望,可能是一個錯誤 –

+0

的例子是錯誤的,我剛剛發佈從正常訂單生成的反向列表將改變爲未來的谷歌 – byrass

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)