2009年10月19日月曜日

リスト内包表記/mapとfilterの代替機能

リスト内包表記とは、リストを加工するための表記方法

一番簡単な例。そのまま出力。
>>> [i for i in [1,2,3]]
[1, 2, 3]

リスト内の要素に対して演算を行う例
各要素の2乗からなるリストを返します。
>>> [i**2 for i in [1,2,3]]
[1, 4, 9]

mapを使えば同じことを実現できます。引数の二乗を返す関数をつくって・・・
>>> def square(x): return x ** 2
...
>>> map(square, [1,2,3])
[1, 4, 9]

lambda式を使えば名前空間に関数を作らずに同じことを実現できます。
>>> map((lambda x: x ** 2), [1,2,3])
[1, 4, 9]

中の値を計算して新しいリストを作る場合は、上記の2例のようにmap関数で同様の処理を行えます。ですが、実行速度も、表記の簡潔さもリスト内包表記の方が優れています。


特定の条件を満たす値だけを取り出す例

奇数の要素だけを取り出します。
>>> [i for i in [1,2,3] if i % 2 == 1]
[1, 3]

これと同様の処理はfilter関数でも実現できます。
>>> def isodd(x): return x % 2 == 1
...
>>> filter(isodd, [1,2,3])
[1, 3]

もちろん、lambda式(ラムダ式)を使うこともできます。
>>> filter((lambda x: x % 2 == 1), [1,2,3])
[1, 3]

このように、filterを使うことで、リスト内包表記と同様の処理を行えますが、実行速度も表記の簡潔さもリスト内包表記の方が優れています。

0 件のコメント:

コメントを投稿