Pythonでのリストの内包表記について

概要

Pythonではリストの内包表記 (list comprehension) が可能である。
この表記方法を使うとリストの生成をfilter()、map() を使わずに簡潔に行う事が出来る。
普段、主にCやJavaを使っている自分にとっては見慣れない表記法だったので、最初は戸惑ったが慣れれば難しくない。
リストの内包表記の便利さを知るために、とりあえずfilter()、map() についてそれぞれ簡単に説明する。

filter(function, sequence)

sequenceの中の要素から、functionの返り値が真となるような要素のみからなるsequenceを返す。
以下の例では、filter()を使うことにより、2の倍数のみからなるリストを取得している。

>>> def f(x): return x%2 == 0
>>> filter(f,range(1,11))
[2, 4, 6, 8, 10]

map(function, sequence)

sequenceの各要素に対してfunctionを呼び出し、その返り値からなるリストを返す。
以下の例では、引数として渡したリストの各要素を3乗したリストを取得している。

>>> def cube(x): return x*x*x
>>> map(cube, range(1, 11))
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

リストの内包表記

リストの内包表記を使うと上の2つの例を以下のように記述することが出来る。

>>> num = range(1,11)
>>> [x for x in num if x % 2 == 0] ##これが内包表記
[2, 4, 6, 8, 10]

>>> [x*x*x for x in num] ##これが内包表記
[1, 8, 27, 64, 125, 216, 343, 512, 729, 1000]

filter()やmap()の際にはf(x),cube(x)のような単純な関数をいちいち定義する必要があったが、リストの内包表記ではその必要がない。
表記内で関数を呼ぶことも出来るので、以下の様な記述も可能。

>>> freshfruit = ['  banana', '  loganberry ', 'passion fruit  ']
>>> [weapon.strip() for weapon in freshfruit]
['banana', 'loganberry', 'passion fruit']