Python: Obtén muchas listas de una lista

Posible duplicado:
¿Cómo se divide una lista en trozos de tamaño uniforme en Python?

Hola,

Me gustaría dividir una lista en muchas listas de una longitud de x elementos, como:

a = (1, 2, 3, 4, 5)

y obten :

b = ( (1,2), (3,4), (5,) )

si la longitud se establece en 2 o:

b = ( (1,2,3), (4,5) )

si la longitud es igual a 3 …

¿Hay una buena manera de escribir esto? De lo contrario, creo que la mejor manera es escribirlo usando un iterador …

La documentación del módulo itertools . Léelo, apréndelo, ámalo.

En concreto, desde la sección de recetas:

 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) 

Lo que da:

 >>> tuple(grouper(3, (1,2,3,4,5))) ((1, 2, 3), (4, 5, None)) 

que no es exactamente lo que quieres … no quieres que None esté ahí … así que. una solución rápida:

 >>> tuple(tuple(n for n in t if n) for t in grouper(3, (1,2,3,4,5))) ((1, 2, 3), (4, 5)) 

Si no te gusta escribir la comprensión de la lista cada vez, podemos mover su lógica a la función:

 def my_grouper(n, iterable): "my_grouper(3, 'ABCDEFG') --> ABC DEF G" args = [iter(iterable)] * n return tuple(tuple(n for n in t if n) for t in itertools.izip_longest(*args)) 

Lo que da:

 >>> tuple(my_grouper(3, (1,2,3,4,5))) ((1, 2, 3), (4, 5)) 

Hecho.

Así es como lo haría yo. Iteración, pero en una lista de comprensión. Tenga en cuenta que el tipo se mezcla; Esto puede o no ser deseado.

 def sublist(seq, length): return [seq[i:i + length] for i in xrange(0, len(seq), length)] 

Uso:

 >>> sublist((1, 2, 3, 4, 5), 1) [(1,), (2,), (3,), (4,), (5,)] >>> sublist([1, 2, 3, 4, 5], 2) [[1, 2], [3, 4], [5]] >>> sublist('12345', 3) ['123', '45'] >>> sublist([1, 2, 3, 4, 5], 73) [[1, 2, 3, 4, 5]] >>> sublist((1, 2, 3, 4, 5), 0) Traceback (most recent call last): File "", line 1, in  File "", line 2, in sublist ValueError: xrange() arg 3 must not be zero 

Por supuesto, también puede hacer que produzca una tuple fácilmente, si lo desea, reemplace la lista de comprensión [...] por tuple(...) . También puede reemplazar seq[i:i + length] con tuple(seq[i:i + length]) o list(seq[i:i + length]) para que devuelva un tipo fijo.

De los documentos de python en el módulo de itertools:

 from itertools import izip_longest def grouper(n, iterable, fillvalue=None): "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx" args = [iter(iterable)] * n return izip_longest(fillvalue=fillvalue, *args) 

Ejemplo:

 >>> tuple(grouper(3, (1, 2, 3, 4, 5, 6, 7))) ((1, 2, 3), (4, 5, 6), (7, None, None))