Python – itertools

概要

itertoolsは高速でメモリー効率のよいイテレーターを生成するツールを提供する。

主となる引数にはコレクション(リスト、タプル)を与える。

文字列を渡すと文字列中の1文字ずつを要素としたリストと同じ効果。

range()関数などコレクションを生成する対象も使える。

無限イテレーター(infinite iterators)

無限イテレーターは、コレクションの要素を繰り返し取り出し続ける。ループ処理に使う場合、break文などの終了処理が必要。

count()

itertools.count(start, [step])
startに与えた数値から初めてstepずつ増加させて取り出す。stepを省略した場合は1ずつ増やす。

cycle()

itertools.cycle(p)
コレクションpを与えて、その要素p0, p1, …, plastを取り出し、その後p0へ戻って繰り返す。

repeat()

itertools.repeat(elem [, n])
elemで与えた要素を第2引数で与えた数値の回数分繰り返す。第2引数を省略すると無限回繰り返す。

組み合わせイテレーター(combinatoric iterator)

組み合わせイテレーターは、コレクションの要素から指定した数を取り出し、それらの直積、順列、組み合わせを結果とする。

product()

itertools.product(p [, repeat=n])
コレクションpの要素について、repeatで指定した数の直積の結果をタプルで返す。同一の要素、順番の異なる同じ組み合わせの要素を持つ結果を許す。
第2引数repeatを省略すると要素数1のタプルを返す。

permutations

itertools.permutations(p [, r=n])
コレクションpの要素について、rで指定した数の順列の結果をタプルで返す。統一要素の組はなく、同じ組み合わせの要素の順番が異なる結果は許す。
第2引数はrepeatではなくrである点に注意。rを省略すると、全ての要素に対する組み合わせを返す。

combinations

itertools.combinations(p, repeat=n)
コレクションpの要素について、repeatで指定した数の組み合わせの結果をタプルで返す。同一要素の組はなく、同じ組み合わせで順番が異なるものは同じ結果となる。
第2引数rは省略できない。省略するとそれ以降の実行がされないなど動作が不定になる。

combinations_with_replacement

itertools.combinations_with_replacement(iterable, r)
組み合わせに、同一要素の重複を許す。
第2引数rは省略できない。省略するとそれ以降の実行がされないなど動作が不定になる。

特に役立ちそうなもの

chain~リストの結合に使える

itertools.chain(*iterables)
複数のiterableを与え、それらの内容を並べた1つのイテレーターを返す。引数の先頭の'*'は複数のiterablesを展開したものであることを表す。

戻り値はイテレーターオブジェクト。

list()関数でリスト化すると、展開されたリストが得られる。

引数にはRangeのようなイテレーターも混在可能。

蛇足だが単一のiteratableはそのまま返されるだけ。

 

chain.from_iterabble~2次元リストの展開に

itertools.chain.from_iterable(iterables)
複数のiterableを与え、それらの内容を並べた1つのイテレーターを返す。引数の先頭に’*’がないのは、引数がiterableを要素に持つiterableであることを表す。

たとえば複数のリストを含む2次元リストの全要素を1次元に展開可能。from_iterable()chainのコンストラクターの一つであり、モジュールのインポート方法とコンストラクターの呼び方に注意。

1次元リストは要素がiterableでないのでエラー。

ndarrayを要素とするリストは、要素の配列が展開されて1次元リストに。

ndarrayの2次元配列も展開可能。結果をリストでほしいときはlist()関数、配列でほしいときは一旦list()関数でリスト化してからnumpy.array()で配列化。

 

zip_longest~最長の引数に合わせるzip

itertools.zip_longest(*iterables, fillvalue=None)
複数のiterableを与え、それらを先頭から順にまとめたイテレーターを返す。結果は最も長いiterableに合わせられ、足りない値はfillvalueで埋められる。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です