Python の itertools と関数を組み合わせた設計

itertools モジュールはイテレータを扱うための強力なツール群を提供します。関数と組み合わせることで、メモリ効率の良いデータ処理が可能です。

itertools.chain:複数のイテラブルを連結

from itertools import chain

list1 = [1, 2, 3]
list2 = [4, 5, 6]
combined = list(chain(list1, list2))
print(combined)  # [1, 2, 3, 4, 5, 6]

itertools.islice:イテレータのスライス

from itertools import islice

def infinite_counter():
    n = 0
    while True:
        yield n
        n += 1

first_five = list(islice(infinite_counter(), 5))
print(first_five)  # [0, 1, 2, 3, 4]

itertools.takewhile / dropwhile

条件を満たす間だけ要素を取得、またはスキップします。

from itertools import takewhile, dropwhile

numbers = [2, 4, 6, 7, 8, 10]
result = list(takewhile(lambda x: x % 2 == 0, numbers))
print(result)  # [2, 4, 6]

itertools.groupby:連続する要素をグループ化

from itertools import groupby

data = [("A", 1), ("A", 2), ("B", 3), ("B", 4), ("A", 5)]
for key, group in groupby(data, key=lambda x: x[0]):
    print(key, list(group))
# A [('A', 1), ('A', 2)]
# B [('B', 3), ('B', 4)]
# A [('A', 5)]

groupby は連続する同一キーをグループ化します。事前にソートが必要な場合があります。

itertools.starmap:アンパックして適用

from itertools import starmap

pairs = [(2, 3), (4, 5), (6, 7)]
result = list(starmap(pow, pairs))
print(result)  # [8, 1024, 279936]

map とは異なり、各要素をアンパックして関数に渡します。