itertools は、イテレータを効率的に扱うための標準ライブラリです。メモリ効率の良いイテレータを簡単に作成でき、データ処理やアルゴリズムの実装に役立ちます。
無限イテレータ
終わりのないシーケンスを生成する関数です。
from itertools import count, cycle, repeat # count: 無限カウント for n in count(10, 3): # 10から3ずつ増加 if n > 20: break print(n, end=" ") # 10 13 16 19 # cycle: 要素を無限に繰り返す colors = cycle(["R", "G", "B"]) for i, c in enumerate(colors): if i >= 6: break print(c, end=" ") # R G B R G B # repeat: 同じ値を繰り返す for x in repeat("Hi", 3): print(x, end=" ") # Hi Hi Hi
終端イテレータ
イテラブルを変換・結合する関数です。
from itertools import chain, islice, takewhile, dropwhile # chain: 複数のイテラブルを連結 result = list(chain([1, 2], [3, 4], [5])) print(result) # [1, 2, 3, 4, 5] # islice: スライス操作 result = list(islice(range(100), 5, 10)) print(result) # [5, 6, 7, 8, 9] # takewhile: 条件を満たす間だけ取得 result = list(takewhile(lambda x: x < 5, [1, 3, 5, 2, 1])) print(result) # [1, 3] # dropwhile: 条件を満たす間はスキップ result = list(dropwhile(lambda x: x < 5, [1, 3, 5, 2, 1])) print(result) # [5, 2, 1]
フィルタリングと選択
from itertools import filterfalse, compress # filterfalse: 条件に合わないものを選択 evens = list(filterfalse(lambda x: x % 2, range(10))) print(evens) # [0, 2, 4, 6, 8] # compress: セレクタでフィルタリング data = ["A", "B", "C", "D"] selectors = [1, 0, 1, 0] result = list(compress(data, selectors)) print(result) # ['A', 'C']
グルーピング
from itertools import groupby # groupby: 連続する同じキーでグループ化 data = [("A", 1), ("A", 2), ("B", 3), ("B", 4), ("A", 5)] for key, group in groupby(data, lambda x: x[0]): print(f"{key}: {list(group)}") # A: [('A', 1), ('A', 2)] # B: [('B', 3), ('B', 4)] # A: [('A', 5)]
注意:groupby は連続する要素のみをグループ化します。全体をグループ化したい場合は、事前にソートしてください。
組み合わせ生成
from itertools import product, permutations, combinations # product: 直積(デカルト積) result = list(product("AB", [1, 2])) print(result) # [('A', 1), ('A', 2), ('B', 1), ('B', 2)] # permutations: 順列 result = list(permutations("ABC", 2)) print(result) # [('A', 'B'), ('A', 'C'), ('B', 'A'), ...] # combinations: 組み合わせ result = list(combinations("ABC", 2)) print(result) # [('A', 'B'), ('A', 'C'), ('B', 'C')]
累積処理
from itertools import accumulate import operator # 累積和 result = list(accumulate([1, 2, 3, 4, 5])) print(result) # [1, 3, 6, 10, 15] # 累積積 result = list(accumulate([1, 2, 3, 4], operator.mul)) print(result) # [1, 2, 6, 24]
よく使う組み合わせ
| 関数 | 用途 |
|---|---|
| chain | リストの連結 |
| islice | スライス(無限イテレータにも使える) |
| groupby | 連続要素のグループ化 |
| combinations | 組み合わせ生成 |
itertools の関数はすべてイテレータを返すため、メモリ効率が良く、大量のデータ処理に適しています。