Pythonの技法:リストの内包表記
文:Nick Gibson(Builder AU)
翻訳校正:原井彰弘
翻訳校正:原井彰弘
2008/01/11 15:00
Pythonによるリストの内包表記(list comprehensions)について学ぶ。リストの内包表記は、当初関数型言語Haskellで用いられていることで有名になった。
map関数とfilter関数は関数プログラミングの基礎となる関数だが、リストの内包表記を利用すればどちらの関数も直感的な方法で使用できるのである。たとえば、map関数とfilter関数を組み合わせて何か処理を行いたい場合でも、コードは非常に単純だ。以下の例を見て欲しい。
>>> [word.lower() for word in wordlist if not world.islower()] ['hello', 'world.', 'are', 'you?']
また、リストの内包表記はネストすることができる。ネストは最初の節でも最後の節でも可能だ。まずは最初の節をネストした例を見て欲しい。
>>> vowels = ['a','A','e','E','i','I','o','O','u','U']] >>> [[letter for letter in word if letter not in vowels] for word in wordlist] [['H', 'L', 'L'], ['W', 'r', 'l', 'd'], ['h', 'w'], ['R'], ['y', '?']]
次に最後の節をネストした例を示そう。この例では、複数の変換を連鎖させている。
>>> [a.lower() for a in [b[i] for b in x for i in range(len(b))]] ['h', 'e', 'l', 'l', 'o', 'w', 'o', 'r', 'l', 'd', 'h', 'o', 'w', 'a', 'r', 'e', 'y', 'o', 'u', '?']
この例を見れば分かるように、リストの内包表記を連鎖するとコードは複雑になり始める。従って、リストの内包表記を一つの式の中で2つ以上組み合わせたい場合は、複数行に分割して記述するとよい。また、ただ単に複数回リストを反復したいだけなら、リストの内包表記のネストを用いる必要はなく、一つのリストの内包表記ですべての操作を行ってしまえばよい。
以下の例では、ディナーパーティーの招待客に対してすべての順列を求める操作を行っている。リストの内包表記を用れば、このような複雑な処理も一度で簡単に記述できる。
>>> guests = ['Chris', 'Brendan', 'Jimmy', 'Mel', 'Mike', 'Jess']
>>> [(seat1, seat2) for seat1 in guests for seat2 in guests if seat1 != seat2]
[('Chris', 'Brendan'), ('Chris', 'Jimmy'), ('Chris', 'Mel'), ('Chris', 'Mike'), ('Chris', 'Jess'), ('Brendan', 'Chris'), ('Brendan', 'Jimmy'), ('Brendan', 'Mel'), ('Brendan', 'Mike'), ('Brendan', 'Jess'), ('Jimmy', 'Chris'), ('Jimmy', 'Brendan'), ('Jimmy', 'Mel'), ('Jimmy', 'Mike'), ('Jimmy', 'Jess'), ('Mel', 'Chris'), ('Mel', 'Brendan'), ('Mel', 'Jimmy'), ('Mel', 'Mike'), ('Mel', 'Jess'), ('Mike', 'Chris'), ('Mike', 'Brendan'), ('Mike', 'Jimmy'), ('Mike', 'Mel'), ('Mike', 'Jess'), ('Jess', 'Chris'), ('Jess', 'Brendan'), ('Jess', 'Jimmy'), ('Jess', 'Mel'), ('Jess', 'Mike')]
リストの内包表記は、既存のコードすべてを置き換えるものではない。しかし、Pythonでプログラムを作成する際にリストの内包表記を道具の一つとして利用すれば、プログラムを以前よりも簡潔で明瞭でしかも高速なものにできるだろう。処理よりもデータそのものに注目したこの手法を利用すれば、非常に複雑な処理でも簡単に記述できるのである。
- 今日のトップ記事
- 昨日
- 2日前
- 3日前
- 6日前
- 7日前
- ホワイトペーパー
- 話題のタグ
Safari
Windows
Python
ブラウザ
入門
Java
リファレンス
PHP
Mozilla
Apache
開発環境
Tips
Off Topic
SOA
Database
Google
iPhone 3G
モバイル
XML
Webアプリケーション開発
Leopard
プログラミング言語
CSS
Webデザイン
仮想化
Ajax
プロジェクト管理
RIA
Webサービス
Ruby
Apple
JavaScript
携帯電話機
Firefox 3
オープンソース
Internet Explorer
iPhone
ソフトウェア開発
仮想化ソフトウェア
server
Mac OS X
Flash
Adobe
Firefox
データベース
HTML
小技
脆弱性
Linux
iPod touch
話題のタグを見る »
このアクセサリはiPhoneでは動作しません
iPhoneでコピー&ペーストを実現するオープンソースソリューションが登場
mixiサービス企画部長に聞く、「プラットフォームを開放する理由」
iPhone 3Gはメールにファイルを添付できないの?
発射台での度胸試し--J・L・ガセー氏が見た「MobileMe」の問題点
Firefox 3.1で強化されるHTML 5対応--Canvas Text APIを検証
つなげ! 速く、美しく、正確に--光ケーブル工事の技能を競う全国大会が開催
あなたのパワポ資料が近未来的に:MSがプラグイン公開
無料の「Oracle Database XE」で高速バッチ処理:活用のポイント
Rubyでどう書く?:RubyCocoa+Core Animationでお手軽アニメーション
ZDNet Japan ホスティング特集
Webセキュリティ特集
セキュリティ対策レベルテスト公開!
APC SOLUTIONS FORUM 2008をレポート
ZDNet Japan Green IT
Techno Exchange
仮想化環境で求められるストレージの要件
DELLが掲げる「新・仮想化アセスメントサービス」