CHAPTER 9 · 5 lessons · 65問

内包表記

リストから新しいリストを1行で作る。Python らしさがいちばん濃く出る書き方。

0 / 65 問クリア

「リストの中身を全部2倍にした、新しいリストがほしい」。こういう処理は毎日のように書く。第2章で覚えたやり方なら、空のリストを作って、for で回して、append で足していく——3行か4行だ。

Python には、これを1行で書く専用の書き方がある。内包表記だよ。

[x * 2 for x in kazus] と書けば、それでもう新しいリストになる。読み方は「kazus の中の x それぞれについて、x * 2 を並べたリスト」。慣れるまでは順番が逆に感じるけれど、慣れるとこちらのほうが読みやすくなる。「何を作るのか」が行の先頭に書いてあるからだ。

さらに if を足せる。[x for x in kazus if x > 0] なら「0より大きいものだけを集めたリスト」。「変換」と「絞りこみ」が1行に収まる。

なぜこれをわざわざ1章使って扱うのかというと、Python のコードを読むうえで避けて通れないからだよ。GitHub にある Python を開けば、まず間違いなく内包表記が出てくる。書けなくても困らないが、読めないと詰まる。この章は「書けるようになる」より「見た瞬間に意味が分かる」ことを目標にする。

章の後半では、入れ子(リストの中のリストを一気にほどく)と、リスト以外への応用を扱う。中かっこに変えれば辞書になるし({k: v for ...})、値だけ並べればセットになる。書き方の骨格は同じで、囲む記号が変わるだけだよ。

ひとつ注意も添えておく。内包表記は短く書けるけれど、詰めこみすぎると読めなくなる。3段の入れ子に if が2つ、みたいなコードは、素直に for で書いたほうが親切だ。短さは目的ではない。読みやすさが目的で、内包表記はたいていの場合それに貢献する、という順序で覚えてほしい。

この章のレッスン

1行でまとめて作る

  1. 841行でリストを作る[x * 2 for x in kazus]。3行かかっていた「作って回して足す」が1行になるよ。問題へ
  2. 85いるものだけを集めるうしろに if を足すと絞りこみ。前に置くと if / else の切りかえ。位置で意味が変わるよ。問題へ
  3. 86入れ子をほどくfor を2つ並べると、リストのリストが一気に平らになるよ。書く順は外側から。問題へ
  4. 87辞書も1行で作る囲む記号を中かっこに変えて キー: 値 と書けば、できるのは辞書。骨格は同じだよ。問題へ
  5. 88重複の消える入れ物中かっこでコロンを外すとセット。同じものが自動で1つにまとまるよ。問題へ

つぎは「高階関数とラムダ式」。関数を値として渡す。「処理そのもの」を引数にできると、書けるものの幅が変わる。