Ich habe Tausende von IDs extrahiert aus einer CSV-Datei (jetzt ist es ein Generator von IDs), um diese IDs zu iterieren und zu verarbeiten.Vermeiden Sie Generator-Splitter, um keine Werte zu erzeugen
Um den Code zu optimieren, habe ich diese IDs in den Batches gruppiert und eine ganze Charge gleichzeitig verarbeitet.
Folgende Code Partition-ate den Generator in der Losgröße von n.
from itertools import zip_longest
def grouper(n, iterable):
""" Grouping of iterable with n objects
Attributes
:n No. of values in a group
:iterable/string to be iterated
:return group of string/iterator values
"grouper(3, 'abcdefg') --> ('a','b','c'), ('d','e','f'), ('g',None, None)"
"""
return zip_longest(*[iter(iterable)]*n)
zB:
>>>acc_ids = ['ID21', 'ID24', 'ID38', 'ID40', 'ID42', 'ID43', 'ID47', 'ID54', 'ID58']
#--As an iterator
>>>id_generator = (i for i in acc_ids)
>>>batches = grouper(7, id_generator)
>>>batches
<itertools.zip_longest object at 0x7f3beb3313b8>
#This iterator is much similar to the below list and notice padded `None`(s) at the end of last batch:
#[('ID21', 'ID24', 'ID38', 'ID40', 'ID42', 'ID43', 'ID47'), ('ID54', 'ID58', None, None, None, None, None)]
Hier ist das Problem, entfernen gepolsterte None
Werte aus dem Iterator Ich verwende filter
for batch in batches:
batch = list(filter(None, batch))
Diese Filter None
Werte aus der Liste zu entfernen . Da ich denke, statt was einen zusätzlichen Filter, können wir verhindern, dass die Herstellung gepolsterte None
Werte während des Generators Aufspalten ...
Abfragen:
- Gibt es einen anderen Ansatz großen Generator zu spalten zu produzieren Chargen ohne None/Null-Werte am Ende der letzten Charge hinzufügen.
ODER - Können wir über die Funktion
grouper
ändern, um gefüllte None-Werte zu unterdrücken?
* "Aber dieser Filter gibt mir eine Liste zurück" *, in Python 3 gibt es keine Liste zurück, ein 'filter' Objekt wird zurückgegeben. –
Textdateien von 'filter' in Python 3" Gib einen Iterator zurück, der diese iterierbaren Elemente ergibt ... " –
@ JimFasarakis-Hilliard: Entschuldigung, dass ich das in eine Liste umwandeln möchte, um einen HTTP-API-Aufruf auszulösen, werde ich aktualisieren die Frage, die ich nur gepolsterte keine Werte entfernen möchte.und müssen Filter vermeiden –