Pythonの技法:リストの内包表記
翻訳校正:原井彰弘
Pythonによるリストの内包表記(list comprehensions)について学ぶ。リストの内包表記は、当初関数型言語Haskellで用いられていることで有名になった。
リストの内包表記(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']
- 今日のトップ記事
- 2日前
- 4日前
- 6日前
- 7日前
- ホワイトペーパー
- 読者投票
- 話題のタグ
MS、Vistaとの互換性をチェックできる「Compatibility Center」リリースへ
「似非」SOAを見破る10の方法
Firefox 3のアドオンやテーマ管理を容易にする
openSUSE 11.0を試してみた
フォトレポート:世界各国の優秀な技術者がパリに集結--Imagine Cup 2008世界大会
バッチ処理でデータベース活用:4つの課題と5つの解決ポイント
Rubyでどう書く?:RubyでWord文書を作成する
ZDNet Japan Green IT
DELL連載第4回〜「Microsoft System Center」
Techno Exchange
「未来の、その先」をどう提言していくか
今知るべき仮想化情報