[python]リスト内包表記(list comprehensions)について 1

Facebook にシェア
Pocket
LINEで送る
このエントリーを Google ブックマーク に追加

素敵。
応用例書くかもしれないからタイトルに1をつける。。。

 

リスト内包表記って

リストを定義するときに通常は、

array = [0,1,2,3,4,5,6,7,8,9]

のように定義する。が、全然スマートじゃない。
それを内包表記、つまり[]の中で色々してスマートに定義する方法。

 

具体的に

ちょっとだけ「ぽく」書くと

In [1]: array = []

In [2]: for x in range(0, 10):
   ...:     array.append(x)
   ...:

In [3]: array
Out[3]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

とできる。とはいえ、配列を定義するのに数行書かないといけないのは
なんとなくイケてない。

ということで内包表記を使うと

In [1]: array = [x for x in range(0, 10)]

In [2]: array
Out[2]: [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

となる。
一見よくわからないけど、リスト内でfor文を回して出てきた値(x)をリストに入力する感じ。

 

ちょっとした応用例

10未満の偶数だけリストにしたい場合、普通だと

array = [0, 2, 4, 6, 8]

と書く。さっきのようにちょっと「ぽく」書くと、

In [1]: array = []

In [2]: for x in range(0,10):
   ...:     if x % 2 == 0:
   ...:         array.append(x)
   ...:

In [3]: array
Out[3]: [0, 2, 4, 6, 8]

となるけどやっぱり大掛かりな感じ。
これを内包表記で書くと、

In [1]: array = [x for x in range(0, 10) if x % 2 == 0]

In [2]: array
Out[2]: [0, 2, 4, 6, 8]

となる。内包表記にはif文が使える。
スマート。

 

おまけ

lambda式とfilter関数を使っても偶数だけ抽出などが行える。

In [1]: filter(lambda x: x%2==0, range(0, 10))
Out[1]: [0, 2, 4, 6, 8]

もっと簡単にだと、range関数の3つ目の引数を指定すれば

In [1]: range(0, 10, 2)
Out[1]: [0, 2, 4, 6, 8]

でもできたりする。

でもリスト内包表記はもっと応用的に使えるので、使えた方がいい。

 

Follow me!

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です