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" }, ]
なんでこんな構造とかそういう話は一旦置いておいて、あったとします。
で、この中からemail
がjohndoe@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
を返してるだけです。