辞書型のリストを特定の値で検索する

Pythonの話です。見る人が見たらどうってことない話なんでしょうがちょっと混乱したのでメモ。

以下のような構造のリストがあったとします。

    [
        {
            "key": 1,
            "name": "Foo Bar",
            "email": "foobar@example.com"
        },
        {
            "key": 2,
            "name": "Scott Tiger",
            "email": "scotttiger@example.com"
        },
        {
            "key": 3,
            "name": "John Doe",
            "email": "johndoe@example.com"
        },
    ]

なんでこんな構造とかそういう話は一旦置いておいて、あったとします。

で、この中からemailjohndoe@example.comのユーザ名nameを取得したいとかそんなユースケースです。

今回はリスト内包表記を使って実現します。ひとまずこんな感じです。

address_list =  [
        {
            "key": 1,
            "name": "Foo Bar",
            "email": "foobar@example.com"
        },
        {
            "key": 2,
            "name": "Scott Tiger",
            "email": "scotttiger@example.com"
        },
        {
            "key": 3,
            "name": "John Doe",
            "email": "johndoe@example.com"
        },
]
name = [x['name'] for x in address_list if x['email'] == "johndoe@example.com"][0]
print(name)

やってることはリスト内の要素1つ1つ(それぞれ辞書型)を取り出してはemailの値をチェックして該当した要素の辞書型のキーがnameの値をもつリストを生成して、その1つ目を返してるだけです。

ただし、このままだと存在しない値が指定されたときにIndexError: list index out of rangeが発生してしまいます。なのでちょっとこんな感じにしてみました。

name = [x['name'] for x in address_list if x['email'] == "johndoe@example.com"]
print(name[0]) if name else None

これはつまり該当する値のリストがnameに入ってるかを見てあればその1つ目を取り出し、なければNoneを返してるだけです。

©Keisuke Nishitani, 2020   プライバシーポリシー