【问题标题】:How to filter out the unique combinations from a list of subsets如何从子集列表中过滤出唯一组合
【发布时间】:2013-04-05 15:59:07
【问题描述】:

this post 的第一个脚本的帮助下,我试图想出一个脚本来实现Subset sum Prob。所以,现在运行我的脚本,我得到了这个:

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]的组合。如何只打印一个而不是全部打印?干杯!!

附言。我知道 Q 可能没有反映我真正想要的,所以请随时改进它。

【问题讨论】:

  • *poke* 忘记了什么?源代码? ...
  • 没有费心添加代码,因为代码的“有效”部分与我在我的 OP 中提到的帖子的第一个脚本相同。此外,我认为它不会被视为一个简单的转换:[[3, 4, 5], [4, 3, 5], [5, 3, 4], [3, 6], [6,3]][[3, 4, 5], [3, 6]]。但我确实同意一点源代码总是好的。对于那个很抱歉。干杯!!

标签: python arrays list subset


【解决方案1】:

不要在列表中多次添加数字,只需添加 (number, multiplicity) 的元组 所以你的输入会变成[(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]) 

【讨论】:

    【解决方案2】:

    使用元组(不可变)而不是列表。然后您可以将它们的列表转换为集合(删除重复项),最后将集合转换回列表。

    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) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-01-11
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多