Dividir una lista en N partes de aproximadamente la misma longitud

Resuelto asked hace 14 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 Len npartes.

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.

 avatar Jan 25 '10 10:01
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]]
tixxit avatar Jan 25 '2010 21:01 tixxit

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

wim avatar Mar 30 '2017 00:03 wim