Caution
お使いのブラウザはJavaScriptが実行できない状態になっております。
当サイトはWebプログラミングの情報サイトの為、
JavaScriptが実行できない環境では正しいコンテンツが提供出来ません。
JavaScriptが実行可能な状態でご閲覧頂くようお願い申し上げます。
itertools.chain() / itertools.islice() / itertools.count()
『itertools』モジュールはイテレータを操作するためのツールを提供します。『itertools.chain()』は複数のイテラブルを連結して1つのイテレータとして扱えます。『itertools.islice()』はイテレータをスライスし、『itertools.count()』は無限に数値を生成します。これらは遅延評価(lazy evaluation)で動作するため、大量のデータも省メモリで処理できます。
構文
import itertools # 複数のイテラブルを連結 itertools.chain(iterable1, iterable2, ...) # イテレータをスライス itertools.islice(iterable, stop) itertools.islice(iterable, start, stop, step) # 無限カウンタ itertools.count(start=0, step=1) # 無限サイクル itertools.cycle(iterable) # 要素の繰り返し itertools.repeat(object, times=None)
関数一覧
| 関数 | 概要 |
|---|---|
| chain(*iterables) | 複数のイテラブルを連結して1つのイテレータにする。 |
| chain.from_iterable(iterable) | ネストされたイテラブルを1段階フラットにする。 |
| islice(iterable, stop) | イテレータをスライスして指定範囲の要素を返す。 |
| count(start, step) | startから始まりstepずつ増加する無限の数列を生成する。 |
| cycle(iterable) | イテラブルの要素を無限に繰り返す。 |
| repeat(obj, times) | objをtimes回(省略で無限回)繰り返すイテレータを返す。 |
サンプルコード
import itertools
# chain: 複数リストを連結
a = [1, 2, 3]
b = [4, 5, 6]
c = ['x', 'y']
result = list(itertools.chain(a, b, c))
print(result) # [1, 2, 3, 4, 5, 6, 'x', 'y']
# chain.from_iterable: ネストされたリストをフラット化
nested = [[1, 2], [3, 4], [5, 6]]
flat = list(itertools.chain.from_iterable(nested))
print(flat) # [1, 2, 3, 4, 5, 6]
# islice: 無限イテレータを安全に扱う
counter = itertools.count(10, 2) # 10, 12, 14, ...
sliced = list(itertools.islice(counter, 5))
print(sliced) # [10, 12, 14, 16, 18]
# islice: start, stop, step を指定
data = range(100)
result = list(itertools.islice(data, 0, 20, 3))
print(result) # [0, 3, 6, 9, 12, 15, 18]
# cycle: 繰り返しパターンの生成
colors = ['赤', '青', '緑']
cycled = list(itertools.islice(itertools.cycle(colors), 7))
print(cycled) # ['赤', '青', '緑', '赤', '青', '緑', '赤']
# repeat: 同じ値をn回繰り返す
repeated = list(itertools.repeat('hello', 3))
print(repeated) # ['hello', 'hello', 'hello']
# map と組み合わせてn乗のリストを生成
squares = list(map(pow, range(5), itertools.repeat(2)))
print(squares) # [0, 1, 4, 9, 16]
概要
『chain()』はリストの結合に『+』演算子を使うよりも効率的で、実際には要素をコピーせずイテレータを繋いで返します。大量のリストを結合する場合に特に効果的です。
『islice()』は無限イテレータと組み合わせて使うことが多く、通常のスライス構文([start:stop])はイテレータには使えないため、isliceが代替手段となります。
『count()』・『cycle()』・『repeat()』は無限に要素を生成するため、必ずisliceや条件付きのbreakと組み合わせて使います。これらはzip()と組み合わせることで、連番付きや繰り返しパターンのデータ生成にも活用できます。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。