内包表記

INPUT · スライド

1行でリストを作る

01 / 07

いつも書いている3行

「リストの中身を全部2倍にした、新しいリストがほしい」。こういう処理は本当によく出てくる。

いまのやりかたなら3つの手順を踏むよね。空のリストを作る、for で回す、append で足す。

kazus = [1, 2, 3]baisu = []for x in kazus:    baisu.append(x * 2)print(baisu)

実行結果

[2, 4, 6]

02 / 07

これを1行で書ける

Pythonには、この形だけを短く書く専用の書きかたがある。内包表記(ないほうひょうき)だよ。

角かっこの中に 作るもの for 名前 in 回すもの と書く。それだけで新しいリストができあがる。

kazus = [1, 2, 3]baisu = [x * 2 for x in kazus]print(baisu)

実行結果

[2, 4, 6]

03 / 07

並べて見くらべる

同じことをする2つのコードを並べてみよう。結果はまったく同じだよ。

baisu = []for x in kazus:    baisu.append(x * 2)
baisu = [x * 2 for x in kazus]

4行が1行になった。しかも空のリストを用意し忘れるという事故も起きない。

kazus = [1, 2, 3]a = []for x in kazus:    a.append(x * 2)b = [x * 2 for x in kazus]print(a)print(b)print(a == b)

実行結果

[2, 4, 6]
[2, 4, 6]
True

04 / 07

読む順番

[x * 2 for x in kazus] の読みかたはこう。

**「kazus の中の x それぞれについて、x * 2 を並べたリスト」**

慣れるまでは順番が逆に感じるはず。うしろの for x in kazus を先に読んで、そのあと先頭の x * 2 に戻る。

でも慣れるとこちらのほうが読みやすくなる。「何を作るのか」が行の先頭に書いてあるからだよ。for 版だと4行目の append まで読まないと、何を作っているのか分からないよね。

namaes = ["ゆい", "はると"]print([n + "さん" for n in namaes])

実行結果

['ゆいさん', 'はるとさん']

05 / 07

回せるものなら何でもいい

in のうしろはリストでなくてもいい。for で回せるものなら何でも置けるよ。range でも文字列でも動く。

第8章でやった「回せるもの」の話が、そのままここに効いてくるんだ。

print([x * x for x in range(1, 6)])print([m for m in "あいう"])

実行結果

[1, 4, 9, 16, 25]
['あ', 'い', 'う']

06 / 07

なぜこれを覚えるのか

正直にいうと、内包表記は書けなくても困らない。for と append で全部書けるからね。

それでもわざわざ1章使うのは、読めないと詰まるからだよ。GitHubにあるPythonのコードを開けば、まず間違いなく内包表記が出てくる。仕事で受け取るコードにも、ライブラリの中にも、当たり前のように並んでいる。

だからこの章の目標は「書けるようになる」より、見た瞬間に意味が分かることだよ。

07 / 07

短さが目的ではない

気をつけてほしいのは、短く書くこと自体は目的ではないということ。

目的は読みやすさで、内包表記はたいていの場合それに貢献する——という順番で覚えてほしい。詰めこみすぎて読めなくなったら本末転倒だよ。

次のレッスンでは、ここに if を足して「いるものだけを集める」書きかたを覚えよう。