如何从子集列表中筛选出唯一的组合

时间:2013-04-05 15:59:07

标签: python arrays list subset

我正在努力想出一个脚本来实现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可能没有反映出我想要的东西,所以随时可以改进它。

2 个答案:

答案 0 :(得分: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]) 

答案 1 :(得分: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将项目转换为元组:

map(tuple, your list of lists)

map(list, your list of tuples)