Kodokon kodokon.com

リスト内包表記と辞書内包表記

組み立てのためのループを表現力のある内包表記に置き換え、データを変換し、絞り込み、インデックスを付け直しましょう。

8 分 · 3 問

このレッスンを Kodokon で開く

リスト内包表記は、プログラミングで最もよく使うパターンを凝縮します。つまり、並びを変換したり絞り込んだりしてリストを組み立てることです。その記法は一つの文のように読めます。[expression for element in sequence if condition]です。appendを使ったループと同じ結果を、宣言的な一行で書けます。Pythonの開発者なら誰でも一目でわかる書き方です。

PYTHON
prices = [12.0, 49.9, 5.5, 199.0]

with_tax = [round(p * 1.2, 2) for p in prices]
cheap = [p for p in prices if p < 50]

print(with_tax)  # [14.4, 59.88, 6.6, 238.8]
print(cheap)     # [12.0, 49.9, 5.5]
式で変換し、末尾のifで絞り込む

辞書内包表記は同じ論理を{key: value for ...}という記法でたどります。プロジェクトでとてもよくある用途は、オブジェクトのリストを識別子で索引し直すことです。そうすれば、必要になるたびにリストを走査する代わりに、すぐに引けるようになります。

PYTHON
users = [
    {"id": 7, "name": "Alice"},
    {"id": 12, "name": "Bruno"},
    {"id": 31, "name": "Chloe"},
]

by_id = {u["id"]: u["name"] for u in users}
print(by_id[12])    # Bruno
print(31 in by_id)  # True
識別子によるインデックスの付け直し:実務コードの定番

ifの置き場所は二つ、役割も二つです。forあとに置くと絞り込みます。はじかれた要素は結果に現れません。forに条件式(a if condition else b)として置くと、要素ごとに値を選びます。このときリストの長さは元のままです。

PYTHON
scores = [45, 82, 67, 91]

labels = ["pass" if s >= 60 else "fail" for s in scores]
print(labels)  # ['fail', 'pass', 'pass', 'pass']
条件式は、どの要素も取り除かずにそれぞれを変換する

理解度チェック

このレッスンの要点をしっかり覚えているか確認しましょう。

  1. [x * 2 for x in data if x > 0]で、ifの役割は何ですか?
    • 要素ごとに二つの値のどちらかを選ぶ
    • 絞り込む:正の要素だけが残される
    • 最初の負の要素で内包表記を止める
  2. {n: n * n for n in range(3)}は何を作りますか?
    • {0: 0, 1: 1, 2: 4}
    • {1: 1, 2: 4, 3: 9}
    • [0, 1, 4]
    • {0, 1, 4}
  3. 内包表記を昔ながらのループに置き換えたほうがよいのはどんなときですか?
    • ロジックが複雑になったり入れ子になったりしたとき
    • リストが百要素を超えたらすぐに
    • 決してない。内包表記が常に望ましい