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

Modified: | Tags: Python, 辞書

Pythonで辞書(dict型オブジェクト)の値valueからキーkeyを抽出する方法を説明する。様々な条件で抽出できる。

反対に、キーkeyから値valueを取得したい場合は以下の記事を参照。

辞書のすべてのキーkeyをリストとして取得するには、list()に辞書を渡せばよい。

d = {'key1': 1, 'key2': 2, 'key3': 3}

print(list(d))
# ['key1', 'key2', 'key3']

リスト内包表記と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)
# []

リストではなくキーそのものを取得したい場合はリストの最初の要素を[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']

関連カテゴリー

関連記事