Home > Python > Python: リスト内包表記(リストコンプリヘンション)をfor文に書き換える

Python: リスト内包表記(リストコンプリヘンション)をfor文に書き換える

簡略記法を知ることでコードのリーディングとライティングを早めることが出来ます。そこで簡略記法と通常?記法(for文)の書き換え方を練習してみましょう。一般化はコードの後に示します。

ソースコード

#!/usr/bin/python
# coding: UTF-8

# リスト内包表記(リストコンプリヘンション)をfor文に書き換える
# List Comprehensions

print [a for a in range(10)]
# 0~9の数値を要素とするリスト
a2 = []
for i in range(10):
    a2.append(i)
print a2

print [b*2 for b in range(10)] # ループのパラメータに演算を行う
# 0~9の数値の×2の結果を要素とするリスト
b2 = []
for i in range(10):
    b2.append(i*2)
print b2

print [c for c in range(10) if c % 2 == 1] # 条件を指定してリストを生成
# in の被演算子を評価後、取り出された要素cをif文にかける。if文が偽のときは、とばして次のループに入る
# 結果として、0~9の数値の中で条件「c % 2 == 1」を満たす、すなわち奇数を要素とするリスト
c2 = []
for i in range(10):
    if (i % 2 == 1):
        c2.append(i)
print c2

print '\n', b2
print [d+1 for d in b2]
d2 = []
for i in b2:
    d2.append(i+1)
print d2

e = 'It is important to set my aims but at the same time I should confirm my present condition.'
print '\n', e
print [wd for wd in e.split(' ')]
e2 = []
for i in e.split(' '):
    e2.append(i)
print e2

実行結果

[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[1, 3, 5, 7, 9]
[1, 3, 5, 7, 9]

[0, 2, 4, 6, 8, 10, 12, 14, 16, 18]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]
[1, 3, 5, 7, 9, 11, 13, 15, 17, 19]

It is important to set my aims but at the same time I should confirm my present condition.
['It', 'is', 'important', 'to', 'set', 'my', 'aims', 'but', 'at', 'the', 'same', 'time', 'I', 'should', 'confirm', 'my', 'present', 'condition.']
['It', 'is', 'important', 'to', 'set', 'my', 'aims', 'but', 'at', 'the', 'same', 'time', 'I', 'should', 'confirm', 'my', 'present', 'condition.']

一般化

[新しいリストに格納する要素(*1) for OLD_ELEMENT in OLD_LIST if 条件式]
*1: 式を書く

リスト内包表記はコード量を短縮し、可読性を増すことが可能ですが、それはリスト内包表記に慣れている人に限ります。

他の言語をメインに使用している人では、コードの保守やリファクタリングの際には、逆にこのPythonの慣用句的な文に戸惑う場合があると考えます。その為、グループでの開発等ではfor文に書き直しておいたほうが良いかもしれません。ただし、個人的に使用するコードという条件であれば、積極的に使ったほうが良いと私は考えます。それは、リスト内包表記の意味する「リストの個々の要素に対して何らかの操作を行い、その結果のリストを返す」というコンセプトが明確で、コードが読み易いからです。

また、「リストの個々の要素に対する操作」の繰り返し処理は存外多くの場面でつかわれるので、リスト内包表記を使用するメリットはあります。ただそれでも、二重ループのリスト内包表記はかなり分かりにくくなるので、それは控えた方がいいかもしれません。

追記(2008-6-17): 文字列の1文字ごとの処理

>>> str = 'hello! hello!'
>>> ' '.join([c.upper() for c in str])
'H E L L O !   H E L L O !'
>>>

ここでの処理内容は、upper()メソッドによる英小文字→大文字の変換です。

チュートリアル

関連記事

 Sponsored Link

Comments:0

Comment Form
Remember personal info

Trackbacks:0

Trackback URL for this entry
http://www.yukun.info/blog/2008/06/python-list-comprehension.html/trackback
Listed below are links to weblogs that reference
Python: リスト内包表記(リストコンプリヘンション)をfor文に書き換える from Yukun's Blog

Home > Python > Python: リスト内包表記(リストコンプリヘンション)をfor文に書き換える

バックナンバー
最近のコメント
最近のトラックバック
メタ情報

Return to page top