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 とは異なり、各要素をアンパックして関数に渡します。