これらのIDを繰り返し処理するために、CSVファイルから数千のIDを抽出しました(現在はIDジェネレータです)。ジェネレータスプリッタを使用せずにNone値を生成する
コードを最適化するために、これらのIDをバッチにグループ化し、バッチ全体を一度に処理しました。
次のコードパーティションは、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)
例:ここでは
>>>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)]
は、このフィルタは、リストからNone
値を削除してfilter
for batch in batches:
batch = list(filter(None, batch))
を使用して私はイテレータからパディングNone
値を削除するには、問題となっています。発電機を分割しながら、私は考えて、代わりに余分なフィルタを追加しているので、我々はパディングNone
値を生成防ぐことができます...
クエリ:
- 生成するために、大きな発電機を分割する他のアプローチがありますバッチ 最後のバッチの終わりにNone/Null値を追加しないでください。
または - 上記の機能を
grouper
に変更して、パッドなしの値を生成することはできますか?
* "このフィルタは私にリストを返す" *、Python 3ではリストを返さず、 'filter'オブジェクトが返されます。 –
Python 3の 'filter'のドキュメント"反復可能なアイテムを生成するイテレータを返す " –
@ JimFasarakis-Hilliard:HTTP API呼び出しを呼び出すリストに変換しているようです質問パディングなしの値を削除したいだけです。フィルタを使用しないでください –