リストをチャンク単位で反復処理する方法 質問する

リストをチャンク単位で反復処理する方法 質問する

整数のリストを入力として受け取る Python スクリプトがあり、一度に 4 つの整数を処理する必要があります。残念ながら、入力を制御できないため、4 要素のタプルのリストとして渡されることになります。現在、次のように反復処理しています。

for i in range(0, len(ints), 4):
    # dummy op for example code
    foo += ints[i] * ints[i + 1] + ints[i + 2] * ints[i + 3]

しかし、これは「C の考え方」によく似ているので、この状況に対処するにはもっと Python 的な方法があるのではないかと思います。リストは反復処理後に破棄されるため、保持する必要はありません。おそらく、次のような方法のほうがよいのではないでしょうか。

while ints:
    foo += ints[0] * ints[1] + ints[2] * ints[3]
    ints[0:4] = []

まだ、ちょっと「しっくりこない」けど。:-/

更新: Python 3.12のリリースに伴い、私は受け入れられた回答を変更しました。まだPython 3.12に移行していない(またはできない)人は、前回の承認済み回答または、以下の他の優れた下位互換性のある回答のいずれか。

関連する質問:Python でリストを均等なサイズのチャンクに分割するにはどうすればよいですか?

ベストアンサー1

def chunker(seq, size):
    return (seq[pos:pos + size] for pos in range(0, len(seq), size))

任意のシーケンスで動作します:

text = "I am a very, very helpful text"

for group in chunker(text, 7):
   print(repr(group),)
# 'I am a ' 'very, v' 'ery hel' 'pful te' 'xt'

print('|'.join(chunker(text, 10)))
# I am a ver|y, very he|lpful text

animals = ['cat', 'dog', 'rabbit', 'duck', 'bird', 'cow', 'gnu', 'fish']

for group in chunker(animals, 3):
    print(group)
# ['cat', 'dog', 'rabbit']
# ['duck', 'bird', 'cow']
# ['gnu', 'fish']

おすすめ記事