C'è un modo per ottenere un nuovo elenco di int da un elenco di int, che si sommano a un certo valore? [duplicare]
Ho un elenco di numeri interi, sono ordinati in modo casuale e possono ripetere: mylist = [5,4,2,4,5,6,7,3,8,3]
e un certo valore (ad esempio value=35
:)
Ora voglio ottenere un elenco di elenchi di numeri interi da mylist
, lo chiamiamo sumlist
, che include tutte le opzioni possibili di numeri che insieme si sommano value
.
In modo che quando avrei fatto:
sum=0
for i in sumlist[0]:
sum+=i
sum == value
sarebbe tornato True
.
Risposte
Itertools.combinations lo gestisce abbastanza facilmente. Quando gli fornisci un elenco e una lunghezza, fornirà tutte le combinazioni possibili di quella lunghezza e, a differenza delle permutazioni, rimuove i duplicati. Per garantire che ogni opzione venga provata, ogni lunghezza (da 0 fino all'intera stringa) deve essere provata, come segue:
import itertools
def SumList(MyList,Value):
for Length in range(1,len(MyList)):
for ListOfVals in itertools.combinations(MyList,Length):
Total=0
for num in ListOfVals:
Total+=num
if Total==Value:
return(ListOfVals)
mylist=[5,4,2,4,5,6,7,3,8,3]
value=35
print(SumList(mylist,value))
>>[5,4,5,6,7,8]
Proprio come una rapida nota a margine, questo produrrà sempre la combinazione più breve, visto che itera attraverso le lunghezze dalla più breve alla più lunga.