C'è un modo per ottenere un nuovo elenco di int da un elenco di int, che si sommano a un certo valore? [duplicare]

Aug 20 2020

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 == valuesarebbe tornato True.

Risposte

E-A Aug 20 2020 at 04:26

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.