Dividir una lista en N partes de aproximadamente la misma longitud
Resuelto
asked hace 15 años
•
37 respuestas
¿ Cuál es la mejor manera de dividir una lista en partes aproximadamente iguales? Por ejemplo, si la lista tiene 7 elementos y la divide en 2 partes, queremos obtener 3 elementos en una parte y la otra debe tener 4 elementos.
Estoy buscando algo así even_split(L, n)
que se rompa L
en n
partes.
def chunks(L, n):
""" Yield successive n-sized chunks from L.
"""
for i in range(0, len(L), n):
yield L[i:i+n]
El código anterior proporciona fragmentos de 3, en lugar de 3 fragmentos. Podría simplemente transponer (iterar sobre esto y tomar el primer elemento de cada columna, llamar a esa parte uno, luego tomar la segunda y ponerlo en la parte dos, etc.), pero eso destruye el orden de los elementos.
Aceptado
Puedes escribirlo de manera bastante simple como un generador de listas:
def split(a, n):
k, m = divmod(len(a), n)
return (a[i*k+min(i, m):(i+1)*k+min(i+1, m)] for i in range(n))
Ejemplo:
>>> list(split(range(11), 3))
[[0, 1, 2, 3], [4, 5, 6, 7], [8, 9, 10]]
Esta es la razón de ser de numpy.array_split
*:
>>> import numpy as np
>>> print(*np.array_split(range(10), 3))
[0 1 2 3] [4 5 6] [7 8 9]
>>> print(*np.array_split(range(10), 4))
[0 1 2] [3 4 5] [6 7] [8 9]
>>> print(*np.array_split(range(10), 5))
[0 1] [2 3] [4 5] [6 7] [8 9]
*crédito a Zero Piraeus en la sala 6