Iterable in Chunks groupen
Verfasst: Samstag 28. Mai 2016, 10:37
Ich brauche eine Iterable/Liste in chunks einer bestimmten Länge: `foo(3, [1,2,3,4,5,6,7,8,9,0]) -> [1,2,3], [4,5,6], [7,8,9], [0]`, den Code den ich bisher immer genutzt habe:
Das funktioniert auch super, wenn man die Chunks nacheinander 'consumed', aber nicht in dem Szenarion:
Ich verstehe warum das passiert (man sieht das recht schnell wenn man sich die Dokumentation zu itertools.islice anschaut), aber ich weiß nicht wie ich das effizient lösen kann.
Normalerweise ist das auch kein Problem, aber ich versuche über `gevent.Pool.pool.imap_unordered` eine Funktion mit Chunks einer bestimmten größe zu callen: `return pool.imap_unordered(foo, grouper_it(3, [1,2,3,4,5,6,7,8,9,0]))` und meine Funktion `foo` wird 10mal aufgerufen mit jeweils einem Eintrag.
Eine offensichtliche Lösung ist nicht iteratoren zu verwenden (bzw. `chunk_it = list(chunk_it)` in der Funktion zu machen), das ist leider keine Lösung weil meine Ausgangsliste durchaus mehr als 10 Elemente (mehr so an die 50k) hat.
PS: Der Codebox gefallen Links in Kommentaren anscheinend nicht
Code: Alles auswählen
def grouper_it(n, iterable):
# http://stackoverflow.com/a/8998040/969534
it = iter(iterable)
while True:
chunk_it = itertools.islice(it, n)
try:
first_el = next(chunk_it)
except StopIteration:
return
yield itertools.chain((first_el,), chunk_it)Das funktioniert auch super, wenn man die Chunks nacheinander 'consumed', aber nicht in dem Szenarion:
Code: Alles auswählen
for chunk in grouper_it(3, [1,2,3,4,5,6,7,8,9,0]):
print chunk, len(list(chunk))
# <itertools.chain object at 0x7f89dacdc850> 3
# <itertools.chain object at 0x7f89dacdc910> 3
# <itertools.chain object at 0x7f89dacdc850> 3
# <itertools.chain object at 0x7f89dacdc910> 1
print len(list(grouper_it(3, [1,2,3,4,5,6,7,8,9,0])))
# 10 -> sollte 4 seinNormalerweise ist das auch kein Problem, aber ich versuche über `gevent.Pool.pool.imap_unordered` eine Funktion mit Chunks einer bestimmten größe zu callen: `return pool.imap_unordered(foo, grouper_it(3, [1,2,3,4,5,6,7,8,9,0]))` und meine Funktion `foo` wird 10mal aufgerufen mit jeweils einem Eintrag.
Eine offensichtliche Lösung ist nicht iteratoren zu verwenden (bzw. `chunk_it = list(chunk_it)` in der Funktion zu machen), das ist leider keine Lösung weil meine Ausgangsliste durchaus mehr als 10 Elemente (mehr so an die 50k) hat.
PS: Der Codebox gefallen Links in Kommentaren anscheinend nicht