Y a-t-il un moyen d'obtenir une nouvelle liste d'entiers à partir d'une liste d'entiers, qui s'ajoutent à une certaine valeur? [dupliquer]
J'ai une liste d'entiers, ils sont triés au hasard et peuvent répéter: mylist = [5,4,2,4,5,6,7,3,8,3]
et une certaine valeur (par exemple: value=35
)
Maintenant, je veux obtenir une liste de listes d'entiers mylist
, nous sumlist
la nommons, qui comprend toutes les options possibles de nombres qui s'additionnent ensemble value
.
Alors que quand je le ferais:
sum=0
for i in sumlist[0]:
sum+=i
sum == value
reviendrait True
.
Réponses
Itertools.combinations gère cela assez facilement. Lorsque vous lui fournissez une liste et une longueur, il donnera toutes les combinaisons possibles de cette longueur et, contrairement aux permutations, il supprime les doublons. Pour s'assurer que chaque option est essayée, chaque longueur (de 0 à la chaîne complète) doit être essayée, comme suit:
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]
Tout comme une note de bas de page rapide, cela produira toujours la combinaison la plus courte, car elle itère sur les longueurs du plus court au plus long.