You are here: Home > Dive Into Python > 組み込みのデータ型 > リストのマップ操作 | << >> | ||||
Dive Into PythonPython from novice to pro |
Python の最も強力な特徴の 1 つはリストの内包表記であり, それを使うと, あるリストの個々の要素にある関数を適用して別のリストに変換する操作が簡潔に行えます.
>>> li = [1, 9, 8, 4] >>> [elem*2 for elem in li] [2, 18, 16, 8] >>> li [1, 9, 8, 4] >>> li = [elem*2 for elem in li] >>> li [2, 18, 16, 8]
以下は2 章で宣言した buildConnectionString 関数の中のリストの内包表記です.
["%s=%s" % (k, v) for k, v in params.items()]
まず, params 辞書の items 関数を呼んでいることに注目してください. この関数は辞書の全てのデータをタプルのリストにして返します.
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> params.keys() ['server', 'uid', 'database', 'pwd'] >>> params.values() ['mpilgrim', 'sa', 'master', 'secret'] >>> params.items() [('server', 'mpilgrim'), ('uid', 'sa'), ('database', 'master'), ('pwd', 'secret')]
さて, buildConnectionString 関数が何をしているか見てみましょう. リスト params.items() を引数に取り, それぞれの要素をフォーマット文字列にはめて新しいリストを作っています. 新しいリストは params.items() と同じ数の要素を持っていますが, それぞれの要素は params 辞書のキーとそれに結び付いた値を含む文字列になります.
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"} >>> params.items() [('server', 'mpilgrim'), ('uid', 'sa'), ('database', 'master'), ('pwd', 'secret')] >>> [k for k, v in params.items()] ['server', 'uid', 'database', 'pwd'] >>> [v for k, v in params.items()] ['mpilgrim', 'sa', 'master', 'secret'] >>> ["%s=%s" % (k, v) for k, v in params.items()] ['server=mpilgrim', 'uid=sa', 'database=master', 'pwd=secret']
params.items() リストを反復するのに 2 つの変数を使っていることに注意してください. これは複数変数割り当てのもう 1 つの使い方です. params.items() の 1 番目の要素は ('server', 'mpilgrim') なので, リストの内包表記の 1 回目の反復では, k には 'server' が割り当てられ v には 'mpilgrim' が割り当てられます. この例では, v の値は無視し, k の値だけを返り値のリストに含めているので, リストの内包表記は params.keys() と同等の結果になります. | |
ここでも同じことをしていますが, k の値を無視しているので, このリストの内包表記は params.values() と同等の結果になります. | |
前の 2 つの例を簡単なフォーマット文字列を使って組み合わせると, 辞書の要素のキーも値も含んだ文字列のリストが得られます. これはいやにあのプログラムの出力に似ています. 後はこのリストの要素を 1 つの文字列につなぎ合わせるだけです. |
<< フォーマット文字列 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | |
リストの結合と文字列の分割 >> |