Взгляните на itertools.combinations:
itertools.combinations(iterable, r)
Возврат r подпоследовательности длины элементов от повторяемого входа.
Комбинации испускаются в лексикографическом порядке сортировки. Так, если повторяемый вход будет отсортирован, кортежи комбинации будут произведены в отсортированном порядке.
С тех пор 2.6, батареи включены!
flag = 0
requiredCals =12
from itertools import chain, combinations
def powerset(iterable):
s = list(iterable) # allows duplicate elements
return chain.from_iterable(combinations(s, r) for r in range(len(s)+1))
stuff = [2,9,5,1,6]
for i, combo in enumerate(powerset(stuff), 1):
if(len(combo)>0):
#print(combo , sum(combo))
if(sum(combo)== requiredCals):
flag = 1
break
if(flag==1):
print('True')
else:
print('else')