2015/07/13更新

[Python] for文処理が1行で書ける!素敵なリスト内包表記

このエントリーをはてなブックマークに追加            

こんにちは、@yoheiMuneです。
今日は前回のPython入門に引き続き、リスト内包表記というPythonの素敵な書き方をブログに書きたいと思います。この書き方を本で見て、Pythonを使えるようになりたいと僕は思いました(ミーハーですねw)。リスト内包表記が書けるようになると、後述の通り色々とメリットがあるのでぜひ学んでみてください。

画像

https://flic.kr/p/24JYSq




1行で書くリスト処理

さっそくリスト内包記述(list comprehension)を扱いたいと思います。今回は以下の配列データを扱うこととします。
data = [1, 2, 3, 4, 5]
この配列について、各要素の値を2倍にする処理を通常のfor文で記述すると、以下のようになります。
# data配列の中身を2倍にする
newData = []
for d in data:
  newData.append(d * 2)
この3行の実装を、リスト内包表記で記述すると1行で記述することができます。素敵!
# data配列の中身を2倍にする
newData = [d * 2 for d in data]
この書き方はシンプルだし直感的に理解できるので、なかなか便利です。



1行で書くリスト処理(if文付き)

さらに、処理の中で条件式(if文)を記述することもできます。例えば偶数のみ処理したい場合に、通常の書き方では以下のように記述します。
newData = []
for d in data:
    if d % 2 == 0:
        newData.append(d * 2)
上記の場合には4行の実装ですが、リスト内包表記だと以下のように1行で記述することができます。
newData = [d * 2 for d in data if d % 2 == 0]
オライリーの本やWeb上のサンプルコードでも良く見る記述なので、この記述は読み書きできる必要がありそうです。



ラムダ式+filterで同じことを実現できる

ラムダ式でもリスト内包表記と同じように、1行で処理を記述することができます。
newData = []
for d in data:
    if d % 2 == 0:
        newData.append(d)
これをラムダ式で書くと以下のようになります。
newData = filter(lambda x:x%2==0, data)
この記述もなかなか良さそうですね!ただラムダ式の場合には、filterした後に演算を行う(例:値を2倍にする)ことができないので、リスト内包表記の方がより柔軟に記述できます。


リスト内包表記はパフォーマンスも良い

通常のfor文を書くよりも、リスト内包表記の方がパフォーマンスが良いです。いくつか調べた情報によると、リスト内包表記でfor処理すれば、記述した文法をC言語レベルで処理するため速いとのこと。実際に試してみました。
import time

# 利用するデータ
data = [i for i in range(1, 1000000)]

# 通常のfor文
time1 = time.clock()
newData = []
for d in data:
    if d % 2 == 0:
        newData.append(d)
time2 = time.clock()
print time2 - time1 #0.234422秒

# リスト内包表記    
time1 = time.clock()
newData = [d for d in data if d % 2 == 0]
time2 = time.clock()
print time2 - time1 #0.185301秒

# filterとラムダ式
time1 = time.clock()
newData = filter(lambda x:x%2==0, data)
time2 = time.clock()
print time2 - time1 #0.184838
何度か試したところ、上記例の場合には、リスト内包表記は通常のfor文記述よりも22%高速でした(僕のMacBookAirの場合)。


参考資料

Pythonのリスト内包表記を学ぶために、以下のサイトを参考にさせていただきました。ありがとうございます!

- リスト内包表記 | Python Snippets

- Python Single Line For Loops | treehouse blog



最後に

今日はPythonの素敵な文法の1つ、リスト内包表記を紹介させていただきました。他の言語でもできれば良いのにと思うくらい素敵な書き方で、いろいろな場面で利用しています。便利なのでぜひぜひ使ってみてください〜♪

現在Pythonを使ってガシガシと実装中です。実務で学んだことを定着すべくこれからもPython記事を書いていきたいと思います。Python記事が気になるという方や、フロントエンドネタが気になる(=こちらが本当は本題w)という方、ぜひRSSTwitterをフォローして頂けますと幸いです ^ ^。

最後までご覧いただきましてありがとうございました!





こんな記事もいかがですか?

RSS画像

もしご興味をお持ち頂けましたら、ぜひRSSへの登録をお願い致します。