2017-10-28 48 views
-2
input set [1,2,3] 

的所有子集蟒蛇 - 與我們得到這個程序的輸出如下itertools.combinations一套

>>> a = [] 
>>> x = [1,2,3] 

>>> for t in range(1, len(x)+1): 
...  k = itertools.combinations(x,t) 
...  a.append([y for y in k]) 

我獲得以下輸出

[ [(1), (2), (3)], [(1, 2), (1, 3), (2, 3)], [(1, 2, 3)] ] 

,但我在尋找這樣的輸出:

[ [(1), (1, 2), (1, 2, 3), (1, 3)], [(2), (2, 3)], [(3)] ] 

任何想法誰得到t他的輸出。

+0

你真的想列表嵌套的兩個級別?或者你只關心元組的順序? –

+0

元組的順序 – codenut

+0

爲什麼這個特定的順序? –

回答

3

下面是產生扁平列表(如你表示在您的評論可以接受的)組合的元組,在期望的順序解決方案:

def combos(x): 
    if len(x) == 0: 
     return [] 
    cs = combos(x[1:]) 
    return [(x[0],)] + [(x[0],) + c for c in cs] + cs 

如果你調用它爲:

print(combos([1, 2, 3])) 

結果是:

[(1,), (1, 2), (1, 2, 3), (1, 3), (2,), (2, 3), (3,)] 

同樣,這是一個扁平化的列表,但這些元組按照您請求的順序排列。

1

你可以只壓平,並對其進行排序:

sorted(sum(a, [])) 

演示:

>>> a = [[(1,), (2,), (3,)], [(1, 2), (1, 3), (2, 3)], [(1, 2, 3)]] 
>>> sorted(sum(a, [])) 
[(1,), (1, 2), (1, 2, 3), (1, 3), (2,), (2, 3), (3,)] 
+0

聰明!但它不會工作時,我不能排序數組最初我有一個字符串數組(食品名稱),我想形成組合,但我無法排序它,因爲組合需要形成的順序輸入由用戶給出。但根據我上面的問題,這也是正確的。謝謝。 – codenut