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
6 respuestas
Las matrices numpy
hacen esto simple
import numpy as np
arr = np.array(L)
arr[arr.cumsum() <= 20].tolist()
#[1, 2, 3, 4, 5]
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
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)
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]
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]
Desde que etiquetaste a Pandas:
pd.Series(L, index=np.cumsum(L)).loc[:20].values
Salida:
array([1, 2, 3, 4, 5], dtype=int64)
Preguntas relacionadas
Nuevas preguntas
python
Python es un lenguaje de programación multipropósito, de tipificación dinámica y de múltiples paradigmas. Está diseñado para ser rápido de aprender, comprender y usar, y hacer cumplir una sintaxis limpia y uniforme. Tenga en cuenta que Python 2 está oficialmente fuera de soporte a partir del 01-01-2020. Aún así, para preguntas de Python específicas de la versión, agregue la etiqueta [python-2.7] o [python-3.x]. Cuando utilice una variante de Python (por ejemplo, Jython, PyPy) o una biblioteca (por ejemplo, Pandas y NumPy), inclúyala en las etiquetas.