De una lista de valores quiero crear una nueva lista de valores hasta que sumen un valor.

Soy nuevo en Python pero creo que es mejor hacerlo con un ciclo while.

L = [1,2,3,4,5,6,7,8,9]
i = 0
s = 0
while i < len(L) and s + L[i] < 20:
    s += L[i]
    i += 1
5
edardvark 10 oct. 2019 a las 21:40

6 respuestas

La mejor respuesta

Las matrices numpy hacen esto simple

import numpy as np

arr = np.array(L)
arr[arr.cumsum() <= 20].tolist()
#[1, 2, 3, 4, 5]
7
ALollz 10 oct. 2019 a las 18:57

Si sumas de principio a fin, la forma (imo) más pitónica sería

s = 0
for element in L:
   if s + element < 20:
         s += element
    else:
         break
-1
DatenBergwerker 10 oct. 2019 a las 19:00

Si estamos hablando de pitón, un bucle for tiene más sentido (también con mejores nombres de variables):

data = [1,2,3,4,5,6,7,8,9]
filtered = []
for num in data:
    if num < 20:
        filtered.append(num)

Pero una comprensión también es pitónica y más corta:

filtered = [num for num in data if num < 20]

Luego, para obtener la suma, simplemente use la función sum:

total = sum(filtered)

O si solo necesitas la suma:

total = sum(n for n in data if n < 20)
1
Jab 10 oct. 2019 a las 19:00

Primero crea la lista vacía y luego agrega valores con las mismas condiciones que estableció. Finalmente, imprimir la lista le devolverá los valores que se agregaron que coinciden con sus criterios:

L = [1,2,3,4,5,6,7,8,9]
i = 0
s = 0
new_list = []
while i < len(L) and s + L[i] < 20:
    new_list.append(L[i])
    s += L[i]
    i += 1
print(new_list)

Salida:

[1, 2, 3, 4, 5]
3
Celius Stingher 10 oct. 2019 a las 18:47

Puede escribir fácilmente su propia función de generador:

L = [1,2,3,4,5,6,7,8,9]

def takeuntil(lst, max_value = 0):
    """Yields elements as long as the cummulative sum is smaller than max_value."""
    total = 0
    for item in lst:
        total += item
        if total <= max_value:
            yield item
        else:
            raise StopIteration

    raise StopIteration

new_lst = [item for item in takeuntil(L, 20)]
print(new_lst)

Lo que produce

[1, 2, 3, 4, 5]
0
Jan 11 oct. 2019 a las 06:41

Desde que etiquetaste a Pandas:

pd.Series(L, index=np.cumsum(L)).loc[:20].values

Salida:

array([1, 2, 3, 4, 5], dtype=int64)
5
Quang Hoang 10 oct. 2019 a las 18:49
58329194