01 / 06
全部はいらない
「点数のリストから、合格した人のぶんだけ集めたい」。今度は全部を変換するのではなく、いるものだけを残す話だよ。
for で書くなら、回しながら if で確かめて、通ったものだけ append する——という形になるね。
tens = [80, 45, 60]goukaku = []for t in tens: if t >= 60: goukaku.append(t)print(goukaku)実行結果
[80, 60]
内包表記
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
内包表記では、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
先頭の式とうしろの 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 を書く位置が違うんだ。
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])実行結果
['ごうかく', 'ごうかく', 'ゆうしゅう']