Python: List comprehensionについて2

Python

あけましておめでとうございます。

気づけば1月も半ばを過ぎました。早い物です。

2020年は昨年よりも役に立つ内容を目指します。
情報的にもそうですが、情緒的にも。
ん?どういう意味?

…ともあれ、List comprehensionの続きを。

あ、ちなみに、頭の絵はピアノの魔術師と呼ばれたリストの似顔絵です。綴りはLisztですって。

さて、前回は、あるリストを元にしてloop、新たなリストを作った場合の動きについてまとめました。

繰り返しになりますが

  • for loopで処理をすると入力時に使ったリストがアウトプットで上書きされる。
  • List comprehensionで処理をすると入力時に使用したリストとは別に新たなリストに出力される。

と言う事です。

今回はList comprehensionの実際の記載方法について。

そう、元々ここが分かっていないからまとめよう、と思って始めた話が調べるほどに拡がって収拾付かなくなりそうでしたが、一旦今の理解をまとめておきます。

構成する要素

今理解しているList comprehensionの式記載に必要な要素。

  1. 数式: 出力の為の計算式
  2. イテレータ(Iterater): 繰り返しの要素
  3. 最初のif-else: 一つ目のif(-else)節
  4. 二つ目のif節: 最初のif節で選んだ集合から更に選択する場合

ここから作られる式”List comprehension”の式の典型的なのは下記3種

(1) 1.数式と2.イテレータ

一番シンプルなList Comprehensionsの式になります。イテレータを元に計算してデータを出力します。

numbers = [1, 2, 3, 4, 5]

double = [number * 2 for number in numbers]

print(double)

出力

[2, 4, 6, 8, 10]

元のリスト[1, 2, 3, 4, 5]を元に新たな”double”と言うリストを作ります。

これをfor loopで行うと

numbers = [1, 2, 3, 4, 5]

double = []
for number in numbers:
    double.append(number * 2)

print(double)

になるでしょうか。

前もって”double”と言うリストを作っておく必要があります。
numbers を上書きすると、エンドレスで2倍していきますのでご注意を。

(2) 1.数式と2.イテレータと3.if(-else)節

1と2で導き出した出力たデータから、if(-else)節でリストに入れるデータを取捨選択します。

numbers = [1, 2, 3, 4, 5]

doubleover7 = [number * 2 for number in numbers if number * 2 > 7]

print(doubleover7)

出力

[8, 10]

例えば”number > 3″ にすると計算前時点の”number”で選ぶ事もできます。
ルールがある様で結構自由に書けます。

これをfor loopで書くと

numbers = [1, 2, 3, 4, 5]

doubleover7 = []
for number in numbers:
    if number * 2 > 7:
        doubleover7.append(number * 2)

print(doubleover7)

縦に長くなってきます。

(3) 1.数式と2.イテレータと3.if(-else)節、更に4.二つ目のif(-else)節

1と2で導き出した出力たデータから、if(-else)節でリストに入れるデータを取捨選択、そのデータからさらにif(-else) 節で条件分けした結果を収納します。

numbers = [1, 2, 3, 4, 5, 6, 18, 20]
bigorsmall = ["small" if number * 2 < 10 else "big" for number in numbers if (number * 2) % 3 == 0]
print(bigorsmall)

出力

['small', 'big', 'big']

1.2で計算(元の数字を2倍)した結果について、更に3で割り切れる結果を選択、その結果が10より小さければ"small"、大きければ"big"を返します。
算出された結果は6, 12, 36なので'small', 'big', 'big'となっています。

これをfor loopで書くと下記でしょうか。
ながっ!

numbers = [1, 2, 3, 4, 5, 6, 18, 20]

calc = []
bigorsmall = []
for number in numbers:
    calc.append(number * 2)
for i in calc:
    if i % 3 == 0 and i < 10:
        bigorsmall.append("small")
    elif i % 3 == 0 and i >= 10:
        bigorsmall.append("big")

print(bigorsmall)

例文の為の例文になり、自分の下手さも相まってかなり長くなった部分があります

が、それはそれとして

どちらが良いのか

for loopかList Comprehensionsかどちらが良いのか、については色々意見が有る様です。

Courseraで教えるUniversity of MichiganのDr. Charlesに言わせると

for loopの方がしっくりくるならそちらに集中した方が良い。
逆にList Comprehensionsを使って感覚に合えば使えば良い。

と言う事の様です。
とは言え、初期レベルのコースにおけるお言葉なので、趣味で続けるなら、と言う事かも知れません。

確かに、最初は普通のfor loopの方が読みやすいでしょう。一行一行記載されているので読みやすさ抜群です。

しかし、慣れてくると冗長に感じてくる部分もあります。きっとこの一行を読むだけ分かる様になって来るのでしょう。

う〜ん、正にコンピューター言語。
そう、「読みやすい」にも段階があると言う事で。

上記例の様に、List comprehensive式の方が書き易く、for loopに変換する方が難しい、と言う場合も結構ありますし、折角の便利な式なので使ってみるのが吉。

私ももっと気軽に出せる様に使い続けてみます。

冗長な文を読んで頂いた皆様に感謝。

コメント

タイトルとURLをコピーしました