Python リスト内包表記

Python学習【365日チャレンジ!】59日目のマスターU(@Udemy11)です。

久しぶりに釣りに行ったんですが、目的のメバルは1匹だけで外道のスズキが1匹、豆アジ1匹という貧果でした。

スズキ メバル アジ

とはいえ、スズキはいい感じにまるまるとした食べごろだったので、刺し身とあらに分けて美味しくいただきました。

ここ数ヶ月は釣りに行ってなかったので、釣れるかどうか心配でした。
目的のメバルは1匹でしたが、スズキでいい感じの引きを味わえたので、良しとしておきます。

それでは今日もPython学習をすすめていきましょう!

昨日の復習

昨日は、ジェネレーターを学習しました。
リストの値を一気に処理するforループと違い、一つ一つの値を一時停止させながら、順番に処理できる特徴がありました。

def greeting():
    yield 'Good morning'
    yield 'Good afternoon'
    yield 'Good night'
 
g = greeting()
print(next(g))
print('insert')
print(next(g))
print('insert')
print(next(g))

出力結果

Good morning
insert
Good afternoon
insert
Good night

forループとの違いは、一つ一つの値で処理を止めて他のことができるところです。

この例では、値の出力の間に、insertを出力しています。

実際の使い所では、forループで一気に処理してしまうとCPUに負担をかけてしまうような場合に、一つ一つの処理を別々にすることで負担を減らしたい場合などに使われるようです。

まだ、具体的にどんな使い方があるのかわかりませんが、こんな使い方をするということをおぼえておきましょう。

リスト内包表記

リスト内包表記とは、読んで字のごとく、リストの中に包み込まれた表記です。

ラムダも関数を短くすることができたように、リスト内包表記は、for文を使って新しいリストを作るときに、リストの中にfor文を記載して、コードを短くすることが可能です。

t = (1, 2, 3, 4, 5)
l = []
for i in t:
    l.append(i)
print(l)

出力結果

[1, 2, 3, 4, 5]

空のリストlを用意して、forループを回して、appendメソッドでリストに変数tのタプルの値を代入していきます。

この処理を次のような1行で書くことが可能です。

l = [i for i in t]

最初のコードと同様に、変数lを出力すれば、同じ結果が出力されます。

条件も付け加えられる

t = (1, 2, 3, 4, 5)
l = []
for i in t:
    if i % 2 == 0:
        l.append(i)
print(l)

出力結果

[2, 4]

%は、商の余りを求める記号なので、2で割って余りが0になる場合は、変数lに値を追加するif文を追加しています。

この条件式もリスト内包表記で書くことが可能です。

l = [i for i in t if i % 2 ==0]

ifを改行せずに続けて記載していますが、これで上記コードと同じ出力になります。

forループのネストも可能

さらに、forループの中にforループを入れるネストもリスト内包表記で書くことが可能です。

t = (1, 2, 3, 4, 5)
t2 = (6, 7, 8, 9, 10)
l = []
for i in t:
    for j in t2:
        l.append(i * j)
print(l)
 
#このように書ける
l = [i * j for i in t for j in t2]
print(l)

出力結果

[6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 18, 21, 24, 27, 30, 24, 28, 32, 36, 40, 30, 35, 40, 45, 50]
[6, 7, 8, 9, 10, 12, 14, 16, 18, 20, 18, 21, 24, 27, 30, 24, 28, 32, 36, 40, 30, 35, 40, 45, 50]

リスト内包表記の構造は次のような感じです。

[計算式 for 変数名1 in タプル1 for 変数名2 in タプル2]

この処理では、変数iに1が入った時点で、変数jにタプルt2の値をを順番に入れていくので、最初の5つの値は、タブルt2の値に1をかけた値が入ります。変数iの2巡目のループでは、2倍、3巡目は3倍という感じで、変数lに値が入っていき、最終的に25この値の入ったリストが出来上がります。

このように、いくつでもforループをネストすることができるので、ついつい長く続けてしまいますが、注意が必要です。

見やすいコードが大切

リスト内包表記は、コードの中にappend>が入らないので、処理が早くなったり、コードが短くなったりするので、よく使われますが、あまりにも長い表記になると、逆にみにくいコードになってしまいます。

Pythonの基本は見やすくてわかりやすいコード

なので、あまりに長いネストになってしまうと意味がわからなくなっちゃいます。

それにコード自体が醜くく!?(見にくく)なっちゃいますので、基本的には、単独のfor文だけや、条件を一つ入れた単純なコードをリスト内包表記にするとおぼえておきましょう。

矢継はやにどんどん新しいことを学習していますので、過去の学習も振り返りながら、学習するようにしましょう。

それでは、明日もGood Python!