¿Hay alguna manera de obtener una nueva lista de ints de una lista de ints que sumen un cierto valor? [duplicar]
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 == value
volvería True
.
Respuestas
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.