Cuando se desea agrupar un iterador en trozos de n
sin relleno el grupo final con un valor de relleno, utilice iter(lambda: list(IT.islice(iterable, n)), [])
:
import itertools as IT
def grouper(n, iterable):
"""
>>> list(grouper(3, 'ABCDEFG'))
[['A', 'B', 'C'], ['D', 'E', 'F'], ['G']]
"""
iterable = iter(iterable)
return iter(lambda: list(IT.islice(iterable, n)), [])
seq = [1,2,3,4,5,6,7]
print(list(grouper(3, seq)))
rendimientos
[[1, 2, 3], [4, 5, 6], [7]]
Hay una explicación de cómo funciona en la segunda mitad de this answer.
Cuando se desea agrupar un iterador en trozos de n
y la almohadilla el grupo final con un valor de relleno, utilice el grouper recipezip_longest(*[iterator]*n)
:
Por ejemplo, en python2:
>>> list(IT.izip_longest(*[iter(seq)]*3, fillvalue='x'))
[(1, 2, 3), (4, 5, 6), (7, 'x', 'x')]
En Python3, lo que era izip_longest
ahora se llama zip_longest
:
>>> list(IT.zip_longest(*[iter(seq)]*3, fillvalue='x'))
[(1, 2, 3), (4, 5, 6), (7, 'x', 'x')]
Cuando se desea agrupar una secuencia en trozos de n
puede utilizar el chunks
receta:
def chunks(seq, n):
# https://stackoverflow.com/a/312464/190597 (Ned Batchelder)
""" Yield successive n-sized chunks from seq."""
for i in xrange(0, len(seq), n):
yield seq[i:i + n]
Tenga en cuenta que, a diferencia de los iteradores en general, sequences by definition tienen una longitud (es decir, __len__
se define).
Si supiera buscar "mero" no habría tenido que preguntar en absoluto. Pero no sabía de ese término. – BCS
+1. Olvidé por completo las prácticas recetas en los documentos. – Skurmedel
Terminé usando esto, pero tuve que hackear el filtrado de los valores de sutura en una etapa posterior. – BCS