Pythonで辞書の値からキーを抽出
Pythonで辞書(dict
型オブジェクト)の値value
からキーkey
を抽出する方法を説明する。様々な条件で抽出できる。
反対に、キーkey
から値value
を取得したい場合は以下の記事を参照。
辞書のすべてのキーkey
をリストとして取得するには、list()
に辞書を渡せばよい。
d = {'key1': 1, 'key2': 2, 'key3': 3}
print(list(d))
# ['key1', 'key2', 'key3']
source: dict_keys_values_items.py
リスト内包表記とitemsメソッドで辞書の値からキーを抽出
辞書の値からキーを抽出するには、リスト内包表記とitems()
メソッドを使う。
リスト内包表記と辞書のforループについては、それぞれ以下の記事を参照。
値value
が指定した値と等しいキーkey
をリストとして抽出する例を示す。指定した値を持つキーが存在しない場合は空のリストが返される。
d = {'key1': 'aaa', 'key2': 'aaa', 'key3': 'bbb'}
keys = [k for k, v in d.items() if v == 'aaa']
print(keys)
# ['key1', 'key2']
keys = [k for k, v in d.items() if v == 'bbb']
print(keys)
# ['key3']
keys = [k for k, v in d.items() if v == 'xxx']
print(keys)
# []
source: dict_get_key_from_value.py
リストではなくキーそのものを取得したい場合はリストの最初の要素を[0]
で取得すればよい。
ただし、指定した値を持つキーが存在しない場合は空のリストとなるため[0]
を指定するとエラーIndexError
になるので注意。
key = [k for k, v in d.items() if v == 'aaa'][0]
print(key)
# key1
key = [k for k, v in d.items() if v == 'bbb'][0]
print(key)
# key3
# key = [k for k, v in d.items() if v == 'xxx'][0]
# print(key)
# IndexError: list index out of range
source: dict_get_key_from_value.py
同じ操作を繰り返し行うのであれば関数化したほうが楽。
def get_keys_from_value(d, val):
return [k for k, v in d.items() if v == val]
keys = get_keys_from_value(d, 'aaa')
print(keys)
# ['key1', 'key2']
source: dict_get_key_from_value.py
重複する値value
を持たない辞書が対象であれば、以下のような関数も考えられる。
指定した値を持つキーがあればそのキーを、無ければNone
を返す。(値value
が重複する場合はいずれかのキーkey
を返す)
def get_key_from_value(d, val):
keys = [k for k, v in d.items() if v == val]
if keys:
return keys[0]
return None
key = get_key_from_value(d, 'aaa')
print(key)
# key1
key = get_key_from_value(d, 'bbb')
print(key)
# key3
key = get_key_from_value(d, 'xxx')
print(key)
# None
source: dict_get_key_from_value.py
様々な条件でキーを抽出するサンプルコード
これまでの例は値value
が指定した値と等しいkey
を抽出したが、リスト内包表記の条件式の部分を変更すれば様々な条件でキーを抽出可能。
d_num = {'key1': 1, 'key2': 2, 'key3': 3}
keys = [k for k, v in d_num.items() if v >= 2]
print(keys)
# ['key2', 'key3']
keys = [k for k, v in d_num.items() if v % 2 == 1]
print(keys)
# ['key1', 'key3']
d_str = {'key1': 'aaa@xxx.com', 'key2': 'bbb@yyy.net', 'key3': 'ccc@zzz.com'}
keys = [k for k, v in d_str.items() if v.endswith('com')]
print(keys)
# ['key1', 'key3']
source: dict_get_key_from_value.py