Вот код Python, который делает то, что вы хотите. Он широко использует itertools, поэтому, чтобы понять его, вы можете взглянуть на документы itertools .
.
>>> import itertools
>>> vals = (5,9,1,3,4,2,6,7,11,10)
>>> combos = itertools.chain(*((x for x in itertools.combinations(vals, i) if sum(x) == 10) for i in xrange(len(vals)+1)))
>>> for c in combos: print c
...
(10,)
(9, 1)
(3, 7)
(4, 6)
(5, 1, 4)
(5, 3, 2)
(1, 3, 6)
(1, 2, 7)
(1, 3, 4, 2)
Что он делает в основном так:
- Для всех возможных размеров подмножества -
for i in xrange(len(vals)+1)
, выполните:
- Перебирать все подмножества с этим размером -
for x in itertools.combinations(vals, i)
- Проверка, равна ли сумма значений подмножества 10 -
if sum(x) == 10
- В этом случае выведите подмножество
Для каждого размера подмножества получен другой генератор, поэтому я использую itertools.chain
, чтобы связать их вместе, чтобы был один генератор, дающий все решения.
Поскольку у вас есть только генератор, а не список, вам нужно подсчитывать элементы при его итерации - или вы можете использовать list(combos)
, чтобы поместить все значения из генератора в список (это потребляет генератор, поэтому не пытайтесь повторить это до / после этого).