1. ホーム
  2. python

[解決済み] Pythonでイテレータをチャンク(n個)で反復処理する?

2022-07-27 01:12:08

質問

イテレータを指定されたサイズのチャンクに分割する良い方法(多分itertoolsで)を思いつくことができますか?

したがって l=[1,2,3,4,5,6,7]chunks(l,3) はイテレータになります [1,2,3], [4,5,6], [7]

私はそれを行うための小さなプログラムを考えることができますが、多分itertoolsを使用して素敵な方法ではありません。

どのように解決するのですか?

この grouper() のレシピを itertools ドキュメントの レシピ は、あなたが望むものに近いです。

def grouper(n, iterable, fillvalue=None):
    "grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

最後のチャンクをfill値で埋めてくれますが。

シーケンス上でのみ動作し、最後のチャンクを希望通りに処理する、より一般的でない解決策は

[my_list[i:i + chunk_size] for i in range(0, len(my_list), chunk_size)]

最後に、一般的なイテレータで動作し、希望通りの振る舞いをする解決策を紹介します。

def grouper(n, iterable):
    it = iter(iterable)
    while True:
        chunk = tuple(itertools.islice(it, n))
        if not chunk:
            return
        yield chunk