Source

pymotw-ja / PyMOTW / itertools / index.rst

Full commit

itertools -- 効率的なループ処理のためのイテレータ関数

目的:itertools モジュールは繰り返し可能な(シーケンスのような)データセットを扱う関数を提供する
Python バージョン:2.3

"lazy functional programming language" の Haskell や SML の類似機能からアイディアを得た関数が提供されています。それらの関数は高速且つ省メモリですが、イテレーションベースのアルゴリズムを複雑化させてしまうこともあります。

イテレータベースのコードの方が複数の理由でリストを使用するコードよりも推奨されます。イテレータで扱うデータは必要になるまで生成されないので、全てのデータを同時にメモリ内には格納されません。メモリ使用量が減少するということはパフォーマンスに影響を与えるスワッピングやその他の巨大なデータセットを扱うときの副作用を小さくします。

イテレータのマージと分割

chain() 関数は引数として複数のイテレータを受け取って、それらが1つのシーケンスであるかのように、全てのコンテンツを生成する1つのイテレータを返します。

izip() 関数は引数で受け取った複数のイテレータの要素をタプルに結合するイテレータを返します。それはリストの代わりにイテレータを返すということを除けばビルトイン関数 zip() のように動作します。

islice() 関数は入力イテレータからインデックスで選択された要素を返すイテレータを返します。それはリストのスライシングのように開始、停止、ステップといった同じ引数を取ります。開始とステップの引数はオプションです。

tee() 関数はオリジナルの入力イテレータを1つ受け取って、複数の独立したイテレータを返します(デフォルトは2つ)。それはその入力イテレータから読み込まれた値を繰り返してファイルや標準出力に書き込む Unix の tee ユーティリティによく似た動作をします。

tee() が生成する新たなイテレータはそのオリジナルの入力イテレータを共有するので、生成後はオリジナルの入力イテレータを使用してはいけません。もしオリジナルの入力イテレータから値を取り出すと、新たなイテレータはその取り出された値を生成しません。

入力を変換する

imap() 関数は入力イテレータの値を引数にして関数を呼び出すイテレータを返します。そして呼び出されたその関数の結果を返します。それは入力イテレータの値がなくなったときに停止するいうこと(代わりに None を追加する)を除けば map() 関数のように動作します。

最初のサンプルでは lambda 関数は入力値を2倍します。2番目のサンプルでは lambda 関数は引数で渡される2つのイテレータから受け取った2つの引数の乗算を行います。そしてオリジナルの引数と算出された値のタプルを返します。

starmap() 関数は imap() 関数によく似ていますが、複数のイテレータを持つタプルを構築する代わりにマッピングする関数への引数として * 構文で1つのイテレータ内にある要素を分割して渡します。imap() にマッピングされる関数が f(i1, i2) のように引数を渡して呼び出す場合 starmap() にマッピングされる関数は f(*i) になります。

新たな値を生成する

count() 関数は無限に連続した整数を生成するイテレータを返します。開始の数のデフォルトはゼロで引数として渡すことができます。上限の引数はありません(結果セットの詳細な制御はビルトイン関数 xrange() を参照)。このサンプルでは、リストの引数の要素がなくなるとそのイテレーションが停止します。

cycle() 関数は引数のコンテンツを無限に繰り返すイテレータを返します。入力イテレータの完全なコンテンツを覚えておく必要があるので、そのイテレータが大きい場合に少しメモリを消費する可能性があります。このサンプルでは数回サイクルした後でループを脱出するためにカウンタ変数が使用されます。

repeat() 関数はアクセスされると毎回同じ値を生成するイテレータを返します。オプションの引数で上限値を渡さない限り無限に値を返します。

定数が他のイテレータからの値と一緒に含まれる必要があるとき izip() 又は imap()repeat() を結合すると便利です。

フィルタリング

dropwhile() 関数は条件が最初に False になった後で入力イテレータの要素を返すイテレータを返します。その条件が False になった後では各要素がフィルタされず、入力イテレータの残りの要素が返されます。

dropwhile() とは逆の機能で takewhile() 関数はテスト関数が True を返す限り入力イテレータから要素を返すイテレータを返します。

ifilter() 関数は、テスト関数が True を返すときのみ要素を含める、ビルトイン関数の filter() のように動作するイテレータを返します。 dropwhile() との違いは全要素に対してテスト関数で判定を行ってその要素を返します。

ifilter() とは逆の機能で ifilterfalse() 関数はテスト関数が False を返すときのみ要素を含めるイテレータを返します。

データのグループ化

groupby() 関数は共通のキーでグループ化された値セットを生成するイテレータを返します。

標準ライブラリドキュメントで紹介されているこのサンプルは同じ値を持つ辞書のキーをグループ化します。

これは複数の属性をベースに関連する値をグループ化することを紹介した複雑なサンプルです。期待した通りに動作するグルーピングのために入力シーケンスがキーの順番通りにソートされている必要があることに注意してください。