viƱetas tipos numeradas listas etiqueta ejemplos anidadas list python

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í:

¿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.