[Python] for文処理が1行で書ける!素敵なリスト内包表記
こんにちは、@yoheiMuneです。
今日は前回のPython入門に引き続き、リスト内包表記というPythonの素敵な書き方をブログに書きたいと思います。この書き方を本で見て、Pythonを使えるようになりたいと僕は思いました(ミーハーですねw)。リスト内包表記が書けるようになると、後述の通り色々とメリットがあるのでぜひ学んでみてください。
- リスト内包表記 | Python Snippets
- Python Single Line For Loops | treehouse blog
現在Pythonを使ってガシガシと実装中です。実務で学んだことを定着すべくこれからもPython記事を書いていきたいと思います。Python記事が気になるという方や、フロントエンドネタが気になる(=こちらが本当は本題w)という方、ぜひRSSやTwitterをフォローして頂けますと幸いです ^ ^。
最後までご覧いただきましてありがとうございました!
今日は前回のPython入門に引き続き、リスト内包表記というPythonの素敵な書き方をブログに書きたいと思います。この書き方を本で見て、Pythonを使えるようになりたいと僕は思いました(ミーハーですねw)。リスト内包表記が書けるようになると、後述の通り色々とメリットがあるのでぜひ学んでみてください。
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)という方、ぜひRSSやTwitterをフォローして頂けますと幸いです ^ ^。
最後までご覧いただきましてありがとうございました!