LoginSignup
13
15

More than 5 years have passed since last update.

ついつい忘れがちなPythonのリスト内包表記

Posted at

初めて見る人には意味がわからないけど使い始めると手放せないリスト内包表記ですが、しばらくPythonから離れていると忘れることがあるので、使い方をメモってみました。

ディクショナリのリストから特定のキー値のみを取り出す

まずはシンプルに、プロフィールのリストから氏名を取り出します。

profiles = [
    {"name": "Tanaka", "age": 17},
    {"name": "Suzuki", "age": 18},
    {"name": "Sato", "age": 19},
]
names = [p["name"] for p in profiles]
print(names)

結果は、こんな感じになります。

['Tanaka', 'Suzuki', 'Sato']

条件付きで値を取り出す

年齢による縛りを入れてみます。18歳以上の氏名のみを取り出します。

profiles = [
    {"name": "Tanaka", "age": 17},
    {"name": "Suzuki", "age": 18},
    {"name": "Sato", "age": 19},
]
names = [p["name"] for p in profiles if p["age"] >= 18]
print(names)

Tanakaさんは18歳未満なので除外されます。

['Suzuki', 'Sato']

結果をディクショナリにする

リストからディクショナリに変換してみます。

profiles = [
    {"name": "Tanaka", "age": 17},
    {"name": "Suzuki", "age": 18},
    {"name": "Sato", "age": 19},
]
names = {p["name"]: p["age"] for p in profiles}
print(names)

氏名が被っているとおかしくなりますが、この例では大丈夫。

{'Tanaka': 17, 'Sato': 18, 'Suzuki': 18}

もう少しリッチなディクショナリにしてみる

ちょっと強引ですが、年齢ごとに氏名のリストを作ってみます。

profiles = [
    {"name": "Tanaka", "age": 17},
    {"name": "Suzuki", "age": 18},
    {"name": "Sato", "age": 18},
]
names = {
    p2["age"]: [
        p1["name"] for p1 in profiles if p1["age"] == p2["age"]
    ]
    for p2 in profiles}
print(names)

こんな感じです。

{17: ['Tanaka'], 18: ['Suzuki', 'Sato']}

13
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
15