2017-10-08 61 views
0

我需要這樣做:我有整數列表,我使所有可能的組合包含這些數字中的3個,輸出是包含這些組合的總和的列表。 (不是所有組合的總和,而是每個組合的總和,但對於每個組合的總和)將整數的組合轉換爲這些組合的總和列表

我的算法這樣做:使所有可能的組合列表,然後計算每個組合的總和並將其保存到列表中,什麼太不起作用如果整數的數量很大。這裏是蟒蛇中的小樣本:

import itertools 

array=[1,2,3,4] 
combs=[] 

els = [list(x) for x in itertools.combinations(array, 3)] 
combs.extend(els) 
result=list(map(sum, combs)) 

你能想出一些更有效的解決方案嗎?也許如果有某種方法可以使它成爲一個循環,首先沒有創建組合列表,並在第二個時候計算每個組合的總和,然後直接計算剛剛創建的組合的總和,將其保存到列表中,然後繼續另一個,直到所有的組合和總和完成。

+3

何不你是不是直接去'[sum(x)for ...]'?將元組轉換爲列表,然後將列表列表轉換爲列表的新列表,然後轉換爲另一個新的整數列表,似乎完全沒有意義。 – jonrsharpe

+1

在不消除「組合」組件的情況下,無法爲大n生效。這本質上是無效的(參見[combinatorial explosion](https://en.wikipedia.org/wiki/Combinatorial_explosion))你需要一個不同的方法來解決你的問題。但爲此,您需要首先定義您的問題。 – ayhan

+0

如果你可以避免做一個清單,那會更好。看看你是否可以重新組織你的邏輯,以便你可以在生成每一筆款項時進行操作。例如,'對於map中的s(sum,combinations(array,3)):do_stuff(s)' –

回答

0

sum()適用於任何可迭代的,而不僅僅是列表。你可以使代碼更有效地通過直接將其應用於組合的元組:

result = [sum(c) for c in itertools.combinations(array, 3)] 

如果你想懶惰地處理的結果,你可以用生成器表達式以及:

result = (sum(c) for c in itertools.combinations(array, 3))