note.nkmk.me

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

Date: 2018-04-13 / tags: Python, 辞書

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

なお、キーから値を取得するのは以下のようにキーを指定するだけでOK。

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]で取得すればよい。

ただし、辞書は順序を持たないので、複数のキーが抽出される場合は[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']
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事