tipos - Cortar una lista en una lista de sub-listas
ol html (4)
La documentación del módulo de itertools
contiene la siguiente recipe :
import itertools
def grouper(n, iterable, fillvalue=None):
"grouper(3, ''ABCDEFG'', ''x'') --> ABC DEF Gxx"
args = [iter(iterable)] * n
return itertools.izip_longest(fillvalue=fillvalue, *args)
Esta función devuelve un iterador de tuplas de la longitud deseada:
>>> list(grouper(2, [1,2,3,4,5,6,7]))
[(1, 2), (3, 4), (5, 6), (7, None)]
Esta pregunta ya tiene una respuesta aquí:
- ¿Cómo se divide una lista en trozos de tamaño uniforme? 58 respuestas
¿Cuál es la manera más simple y razonablemente eficiente de dividir una lista en una lista de las secciones de sub-listas divididas para sublistas de longitud arbitraria?
Por ejemplo, si nuestra lista de fuentes es:
input = [1, 2, 3, 4, 5, 6, 7, 8, 9, ... ]
Y nuestra sublista de longitud es 3 entonces buscamos:
output = [ [1, 2, 3], [4, 5, 6], [7, 8, 9], ... ]
Del mismo modo, si la longitud de nuestra lista secundaria es 4, buscamos:
output = [ [1, 2, 3, 4], [5, 6, 7, 8], ... ]
Me gusta la solución de SilentGhost.
Mi solución usa programación funcional en python:
group = lambda t, n: zip(*[t[i::n] for i in range(n)])
group([1, 2, 3, 4], 2)
da:
[(1, 2), (3, 4)]
Esto supone que el tamaño de la lista de entrada es divisible por el tamaño del grupo. Si no, los elementos no emparejados no serán incluidos.
Una variante realmente pitónica (python 3):
list(zip(*(iter([1,2,3,4,5,6,7,8,9]),)*3))
Se crea un iterador de lista y se convierte en una tupla con 3 veces el mismo iterador, luego se desempaqueta en zip y se convierte en lista de nuevo. Se extrae un valor de cada iterador mediante zip, pero como solo hay un objeto iterador, el contador interno aumenta globalmente para los tres.
[input[i:i+n] for i in range(0, len(input), n)] # Use xrange in py2k
donde n
es la longitud de un trozo.
Dado que no define lo que podría suceder con el elemento final de la nueva lista cuando el número de elementos en la input
no es divisible por n
, asumí que no tiene importancia: con esto obtendrá el último elemento igual a 2 si n
igual a 7, por ejemplo.