我有一个数字清单,例如
numbers = [1, 2, 3, 7, 7, 9, 10]
如您所见,数字在此列表中可能会出现多次。
我需要获得具有给定总和的这些数字的所有组合,例如10。
10
组合中的项目可能不会重复,但是其中的每个项目numbers都必须唯一对待,这意味着,例如7列表中的两个代表具有相同值的不同项目。
numbers
7
顺序并不重要,因此[1, 9]和[9, 1]是相同的组合。
[1, 9]
[9, 1]
组合没有长度限制,[10]与一样有效[1, 2, 7]。
[10]
[1, 2, 7]
如何创建符合以上条件的所有组合的列表?
在这个例子中, [[1,2,7], [1,2,7], [1,9], [3,7], [3,7], [10]]
[[1,2,7], [1,2,7], [1,9], [3,7], [3,7], [10]]
您可以使用itertools遍历每种可能大小的每种组合,并过滤掉总计不等于10的所有内容:
import itertools numbers = [1, 2, 3, 7, 7, 9, 10] result = [seq for i in range(len(numbers), 0, -1) for seq in itertools.combinations(numbers, i) if sum(seq) == 10] print result
结果:
[(1, 2, 7), (1, 2, 7), (1, 9), (3, 7), (3, 7), (10,)]
不幸的是,这有点像O(2 ^ N)的复杂性,因此它不适用于大于20个元素的输入列表。