Pythonで辞書の値からキーを抽出
Pythonで辞書(dict
型オブジェクト)の値value
からキーkey
を抽出する方法を説明する。様々な条件で抽出することが可能。
なお、キーから値を取得するのは以下のようにキーを指定するだけでOK。
d = {'key1': 'aaa', 'key2': 'aaa', 'key3': 'bbb'}
value = d['key1']
print(value)
# aaa
source: dict_get_key_from_value.py
キーから値を取得するにはget()
メソッドを使う方法もある。get()
メソッドだと存在しないキーを指定してもエラーにならない。以下の記事を参照。
スポンサーリンク
リスト内包表記とitemsメソッドを使用
リスト内包表記、および、for文で辞書のキーと値を取得するitems()
メソッドを使う。
リスト内包表記と辞書のforループについては、それぞれ以下の記事を参照。
値value
が指定した値と等しいキーkey
をリストとして抽出する例を示す。指定した値を持つキーが存在しない場合は空のリスト。
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]
でどのキーが取得できるかは不定。
また、指定した値を持つキーが存在しない場合は空のリストとなるため[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
スポンサーリンク