Pythonで辞書の値からキーを抽出

Pythonで辞書(dict型オブジェクト)の値valueからキーkeyを抽出する方法を説明します。様々な条件で抽出することができます。 なお、キーから値を取得するのは以下のようにキーを指定するだけで問題ありません。

d = {'key1': 'aaa', 'key2': 'aaa', 'key3': 'bbb'}

value = d['key1']
print(value)
# aaa

キーから値を取得するには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)
# []

リストではなくキーのオブジェクトそのものを取得したい場合はリストの最初の要素を[0]で取得すればOKです。 ただし、辞書は順序を持たないので、複数のキーが抽出される場合は[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

同じ操作を繰り返し行うのであれば関数化したほうが楽。

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']

重複する値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

様々な条件でキーを抽出

これまでの例は値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']
Last Updated: 6/26/2019, 10:34:03 PM