Digital Rabbit - 記憶の見世棚
日々の学びや気付きなどを淡々と書いていきます。
2016年12月24日土曜日
Python3 の「リスト内包表記」色々
Python を学んでいて一番最初に混乱をきたしたのがリストを生成するときに使う、「リスト内包表記」でした。 特に if 条件式を使用するケースにおいて、 else がつく場合とそうではない場合で位置が逆転するなど、中々に混乱する感じなので、纏めてみました。 (C -> C++ -> Java とやってくると、 LL 言語のこの辺の表記はホントに辛い…) #### まずは基本形 一番の基本系は: ``` python comprehensions = [x for x in range(10)] ``` です。 ここで一番最初に登場する `x` は、リストに append する変数となっていて、例えば: ``` python comprehensions = [list[x] for x in range(10)] ``` となっている場合、 `list` リストの `x` 番目の値が `comprehensions` に append される値になります。 `for x in range(10)` は iterator とその値です。 ここでの `x` は前述の `x` と等価であり、 `in` 以降で処理された値が入ります。 この例では `range(10)` の返り値である 0 から 9 までが順に `x` へと代入されていきます (その辺の動きは、通常の `for` 構文の動きと同一です)。 結果 `comprehensions` は `[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]` となります。 #### リストへ含める値に条件を付ける場合 例として上記のリスト内包表記を使用し、さらに結果として生成されるリストには「偶数」 (この場合は 0 も含む) のみを含める場合を考えます。 この場合での偶数の算出には `x % 2 == 0` を使用しましょう。 リスト内包表記で、条件を付ける場合には `if` 構文が使用できます。 したがって、この場合は: ``` python even = [x for x in range(10) if x % 2 == 0] ``` となります。 ここでは `if` の位置に関して、 `for` 構文の後ろに記述されています。 これは、 __Iteration 中の値に対してフィルタリングを行なうには、 for 構文の「後ろ」で if 構文を使う__ ことに因ります。 つまりこのケースの場合、 Iteration によって導き出される 0 から 9 までの値に対して `x % 2 == 0` のフィルタリングを行い、条件式が `True` になる値のみを append する値に使用することになります。 結果 `even` には `[0, 2, 4, 6, 8]` が入ります。 #### 条件に従ってリストに入力する値を変更する場合 次に、値が偶数の場合には 100, 奇数の場合には 200 を足した値をリストにするリスト内包表記を考えてみます。 この場合、 iteration で算出される値をフィルタリングするわけではないので、先ほどの `for` 構文の後に `if` 構文を記述する形式では表現できません。 つまり、今回は iteration により算出される値はすべて使用し、その上で条件によってリストに入力する値を変化させる必要があるわけです。 そのような場合には: ```python custom_list = [x + 100 if x % 2 == 0 else x + 200 for x in range(10)] ``` となります。 まずは `for x in range(10)` の部分ですが、これは今までにも出てきたものと同様、 iterator とその値になります。 このケースでは iteration で算出した値をフィルタする必要は無いので、後ろに `if` 構文を追加することなくそのまま使用されます。 次に: ```python x + 100 if x % 2 == 0 else x + 200 ``` の部分ですが、これは: ```python
if <条件式> else
``` となっています。 通常の `if` 構文で表現した場合: ```python custom_list = [] for x in range(10): if x % 2 == 0: custom_list.append(x + 100) else: custom_list.appned(x + 200) ``` と等価になります。 通常の `if` 構文と違い、リスト内包表記になると条件式より前に `True` 時の値が来るので少し混乱してしまうのですが、何とか慣れるしかないです。 結果として `custom_list` には、 `[100, 201, 102, 203, 104, 205, 106, 207, 108, 209]` が入ります。 #### まとめ つらつらと書いてきましたが、ややこしいのは `if` が入り込むケースだけで、その場合には: * Iteration で算出される値に条件を付けたい場合、 `for` 構文の後に `if` 構文で表現する * リストへの入力値を条件で変化させたい場合、先頭の設定知の表現で `if` 構文を用いる っていう感じで覚えればいいのかな?と思います。 今まで Java をやってきて、初めて Python を見たときに一番戸惑った部分なので、ちょっとまとめてみました。 リスト内包表記は本当に戸惑うのですが、覚えてしまえばかなり簡潔に表現ができますし、コードも綺麗になると思うので、ぜひ覚えておきたい表現だと思います。
0 件のコメント:
コメントを投稿
次の投稿
前の投稿
ホーム
登録:
コメントの投稿 (Atom)
0 件のコメント:
コメントを投稿