Pythonの技法:リストの内包表記

文:Nick Gibson(Builder AU)  翻訳校正:原井彰弘
2008-01-11 15:00:00
  • このエントリーをはてなブックマークに追加

 リストの内包表記(list comprehensions)は、当初関数型言語Haskellで用いられていることで有名になった。Pythonでリストの内包表記を用いると、変換対象のデータに注目してコードを記述することが可能になる。それは、関数に注目してコードを記述していたかつての方法とはまったく異なる手法だ。

 リストの内包表記を用いて行えることはすべて、組み込みのmap関数とfilter関数を用いて記述することも可能である。しかし、リストの内包表記を利用すると、より使用が簡単で可読性の高いコードを記述できる。本稿では、単純な例をいくつか用いてリストの内包表記の強力さをお見せしよう。

 Pythonでリストを記述する際は、以下のようにして各アイテムを並べてブラケットでくくる。

>>> wordlist = ['HELLO', 'World', 'how', 'aRe', 'YOU?']

 リストの内包表記を利用する場合も、基本的にはこれと同じように記述する。ただし一つ異なるのは、アイテムを並べる代わりに、別のリストをどのように変換するかを記述するということだ。具体的な例を挙げてみよう。先ほどの単語のリストに対して、各単語を小文字にする操作を行いたいとする。この場合、普通は以下のような記述を行うかもしれない。

>>> l = []
>>> for word in wordlist:
        l.append(word.lower())
>>> l
['hello', 'world.', 'how', 'are', 'you?']

 しかし、このコードは長すぎるし動作速度も遅い。なぜなら、for文を使用した場合、Pythonはいつも暗黙的にループを実行しているからだ。もし関数型言語になじみがあれば、ここで次のような記述を行うかもしれない。

>>> import string
>>> map(string.lower,wordlist)
['hello', 'world.', 'how', 'are', 'you?']

 先ほどのコードよりは少し改善されたが、このコードは少し暗号めいている。このような場合にリストの内包表記を用いると、以下のように記述することが可能だ。

>>> [word.lower() for word in wordlist]
['hello', 'world.', 'how', 'are', 'you?']

 このバージョンは、先ほどのコードと比較して短くはない。しかし、多くの場合はこちらの方が明瞭だと言えるだろう。どちらのアプローチを利用するかは、その状況に合わせてあなた自身が判断を行えばよい。

 リストの内包表記は、組み込みのfilter関数を完全に置き換える目的でも使用できる。たとえば、先ほどのリストの中から小文字の単語のみを抽出したい場合は、以下のように書くことも可能だ。

>>> [word for word in wordlist if world.islower()]
['how']
  • 新着記事
  • 特集
  • ブログ