2013-04-05 62 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)