2013-04-05 49 views
1

我試圖想出一個腳本來實現Subset sum Prob,並從this post的第一個腳本獲得了一些幫助。所以,現在運行我的腳本,我得到這個:如何從子集列表中篩選出唯一的組合

maci:python sant$ ./subsetSum.py -n3,4,5,6,7,8,9,3,4,5 -t12 
[3, 4, 5] => 12 
[3, 4, 5] => 12 
[3, 5, 4] => 12 
[3, 6, 3] => 12 
[3, 9] => 12 
[3, 4, 5] => 12 
[4, 5, 3] => 12 
[4, 8] => 12 
[4, 3, 5] => 12 
[5, 7] => 12 
[5, 3, 4] => 12 
[7, 5] => 12 
[8, 4] => 12 
[9, 3] => 12 
[3, 4, 5] => 12 

這是工作得很好。但是,我如何過濾出唯一的子集?結果1,2和15完全相同,還有6個是[3,4,5]的組合。我如何只打印一個而不打印所有這些文件?乾杯!!

PS。我知道Q可能沒有反映我真正想要的東西,所以請隨時改進。

+5

\ *捅\ *忘了點什麼?源代碼? ... – 2013-04-05 16:00:27

+0

沒有打擾添加代碼,因爲代碼的「有效」部分與我在OP中提到的帖子的第一個腳本完全相同。此外,我認爲它將被視爲一個簡單的轉換:'[[3,4,5],[4,3,5],[5,3,4],[3,6],[6, 3]]'到'[[3,4,5],[3,6]]'。但我同意一些源代碼總是好的。對於那個很抱歉。乾杯!! – MacUsers 2013-04-05 17:28:31

回答

1

而不是多次在您的列表中的數字只是添加(數字,多樣性) 的元組,使您的輸入將成爲[(3, 2), (4, 2), (5, 2), (6, 1), (7, 1), (8, 1), (9, 1)]

這可以很容易地創建沒有重複的子集。你可以做出頭,如:

for i in n[1]: 
    subset_sum_recursive(remaining, target, partial + i * [n[0]]) 

或者它可能是更容易保持不僅是你的「部分」名單,但也有「丟棄」名單。然後你可以檢查

if(n not in discarded) 
    subset_sum_recursive(remaining,target,partial + [n]) 
0

使用元組(這是不可變的)而不是列表。然後,您可以將它們的列表轉換爲一個集合(刪除重複的集合),最後將集合轉換回列表。

list(set([(3,4,5),(3,4,5),(3,5,4),(3,6,3) ...]))產生[(3,4,5),(3,5,4),(3,6,3) ...]

您可以使用地圖上的物品轉換,並從元組:

map(tuple, your list of lists) 

map(list, your list of tuples)