内包表記

INPUT · スライド

いるものだけを集める

01 / 06

全部はいらない

「点数のリストから、合格した人のぶんだけ集めたい」。今度は全部を変換するのではなく、いるものだけを残す話だよ。

for で書くなら、回しながら if で確かめて、通ったものだけ append する——という形になるね。

tens = [80, 45, 60]goukaku = []for t in tens:    if t >= 60:        goukaku.append(t)print(goukaku)

実行結果

[80, 60]

02 / 06

うしろに if を足す

内包表記では、for のうしろに if 条件 を足すだけでいいよ。

[x for x in kazus if x > 0] なら「kazus の中の x それぞれについて、x > 0 のものだけを並べたリスト」。

条件に当てはまらなかったものは、新しいリストに入らない。だから元より短くなるんだ。

kazus = [3, -1, 5, -2]print([x for x in kazus if x > 0])

実行結果

[3, 5]

03 / 06

変換と絞りこみが1行に収まる

先頭の式とうしろの if は、同時に使える。

「0より大きいものだけを、2倍して並べる」が1行で書ける。for 版だと5行かかっていたものだよ。

読む順は右から左。まず for でどこから取るかを見て、次に if で絞りこみを見て、最後に先頭の式で何を作るかを見る。

kazus = [3, -1, 5, -2]print([x * 2 for x in kazus if x > 0])

実行結果

[6, 10]

04 / 06

「そうでないとき」も入れたい

では「0より大きければ せい、そうでなければ ふ」のように、どちらの場合も値がほしいときは?

これは絞りこみではなく切りかえだよ。全部の要素が結果に残るので、個数は元のままになる。

このときは a if 条件 else b という書きかたを使う。条件が成り立てば a、そうでなければ b という1つの式だよ。

kazu = 3print("せい" if kazu > 0 else "ふ")

実行結果

せい

05 / 06

if だけなら後ろ、else が要るなら前

ここが混乱しやすいところ。if を書く位置が違うんだ。

  • 絞りこみ(if だけ)… for のうしろ — [x for x in xs if x > 0]
  • 切りかえ(if と else)… for の前、先頭の式のところ — [a if x > 0 else b for x in xs]

覚えかたは「else が要るなら前」。else 付きは「作るものを決める式」そのものなので、作るものを書く場所、つまり先頭に来るんだよ。

kazus = [3, -1, 5, -2]print([x for x in kazus if x > 0])print(["せい" if x > 0 else "ふ" for x in kazus])

実行結果

[3, 5]
['せい', 'ふ', 'せい', 'ふ']

06 / 06

両方いっぺんに使える

実は前の if / else とうしろの if を、同時に書くこともできる。

ただしここまで来ると読みにくい。1行に詰めこむより、素直に for で書いたほうが親切なこともあるよ。判断の基準は「他人が一目で読めるか」だよ。

次のレッスンでは、for そのものを2つ並べる「入れ子」を扱おう。

tens = [80, 45, 60, 95]print([("ゆうしゅう" if t >= 90 else "ごうかく") for t in tens if t >= 60])

実行結果

['ごうかく', 'ごうかく', 'ゆうしゅう']