Quando si desidera raggruppare un iteratore in blocchi di n
senza imbottitura il gruppo finale con un valore di riempimento, utilizzare 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)))
rendimenti
[[1, 2, 3], [4, 5, 6], [7]]
C'è una spiegazione di come funziona nella seconda metà di this answer.
Quando si desidera raggruppare un iteratore in blocchi di n
e pad il gruppo finale con un valore di riempimento, utilizzare il grouper recipezip_longest(*[iterator]*n)
:
Per esempio, in python2:
>>> list(IT.izip_longest(*[iter(seq)]*3, fillvalue='x'))
[(1, 2, 3), (4, 5, 6), (7, 'x', 'x')]
In Python3, cosa è stato izip_longest
è ora rinominato zip_longest
:
>>> list(IT.zip_longest(*[iter(seq)]*3, fillvalue='x'))
[(1, 2, 3), (4, 5, 6), (7, 'x', 'x')]
Quando si desidera raggruppare una sequenzain blocchi di n
è possibile utilizzare il chunks
ricetta:
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]
Si noti che, a differenza di iteratori in generale, sequences by definition hanno un lunghezza (es __len__
è definito).
Se sapessi cercare "cernia" non avrei avuto bisogno di chiedere niente. Ma non sapevo di quel termine. – BCS
+1. Completamente dimenticato delle ricette a portata di mano nei documenti. – Skurmedel
Ho finito per usare questo, ma ho dovuto hackerare nel filtrare i valori di riempimento in una fase successiva. – BCS