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

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

 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でプログラムを作成する際にリストの内包表記を道具の一つとして利用すれば、プログラムを以前よりも簡潔で明瞭でしかも高速なものにできるだろう。処理よりもデータそのものに注目したこの手法を利用すれば、非常に複雑な処理でも簡単に記述できるのである。

このサイトでは、利用状況の把握や広告配信などのために、Cookieなどを使用してアクセスデータを取得・利用しています。 これ以降ページを遷移した場合、Cookieなどの設定や使用に同意したことになります。
Cookieなどの設定や使用の詳細、オプトアウトについては詳細をご覧ください。
[ 閉じる ]