¿Hay alguna manera de obtener una nueva lista de ints de una lista de ints que sumen un cierto valor? [duplicar]

Aug 20 2020

Tengo una lista de números enteros, se ordenan al azar y pueden repetir: mylist = [5,4,2,4,5,6,7,3,8,3]y un cierto valor (por ejemplo: value=35)

Ahora quiero obtener una lista de números enteros de mylist, lo nombramos sumlist, que incluye todas las opciones posibles de números que juntos suman value.

Entonces cuando haría:

sum=0
for i in  sumlist[0]:
   sum+=i

sum == valuevolvería True.

Respuestas

E-A Aug 20 2020 at 04:26

Itertools.combinations gestiona esto con bastante facilidad. Cuando le proporcione una lista y una longitud, dará todas las combinaciones posibles de esa longitud y, a diferencia de las permutaciones, elimina los duplicados. Para garantizar que se prueben todas las opciones, se debe probar cada longitud (desde 0 hasta la cadena completa), de la siguiente manera:

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]

Solo como una nota al margen rápida, esto siempre generará la combinación más corta, ya que recorre las longitudes de la más corta a la más larga.