如何根据值从字典列表中获取键

How to get a key from a list of dictionaries by its value

我有一个字典列表,我正在尝试通过其值获取字典键:

list1 = [{'a':1,'b':2,'c':3},
         {'d':4,'e':5,'f':6},
         {'g':7,'h':8,'i':9}]

如果值 5 存在于字典列表中,我将在此尝试获取字典键。

for dic in list1:
    for key in dic:
        if dic[key] == search_value:
            print key

您的问题不明确,正如 Peter DeGlopper 所言:

What result are you expecting if multiple keys have the target value? Does it differ if the keys are in different dictionaries?

但是,例如,如果您想要一个二元组列表 (i, k) – 其中 i 是找到该值的字典的索引(在列表中),并且 k 是与值关联的键——以下工作:

def index_keys(data, value):
    return [(i, k) for i, d in enumerate(data) for k, v in d.items() if v == value]

示例:

>>> list1 = [
...     {'a':1,'b':2,'c':3},
...     {'d':4,'e':5,'f':6},
...     {'g':7,'h':8,'i':9}
... ]
>>> index_keys(list1, 5)
[(1, 'e')]
>>> list1[1]['e'] == 5
True

>>> list2 = [
...     {'a': 1, 'b': 2, 'c': 3, 'd': 4},
...     {'w': 2, 'x': 4, 'y': 6, 'z': 8},
...     {'a': 6, 'b': 6, 'y': 6, 'z': 8}
... ]
>>> index_keys(list2, 2)
[(0, 'b'), (1, 'w')]
>>> index_keys(list2, 8)
[(1, 'z'), (2, 'z')]
>>> index_keys(list2, 6)
[(1, 'y'), (2, 'a'), (2, 'y'), (2, 'b')]

如果所有字典中的值都与此处不同,您可以构建一个反向查找字典:

reverselookup = {}
for d in list1:
    reverselookup.update({v: k for k, v in d.items()})

然后您可以使用它通过索引字典来查找与值对应的键:

>>> reverselookup[5]
'e'

如果值不同但键不同,您可以改为构建相应键的列表。

import collections
reverselookup = collections.defaultdict(list)
for d in list1:
    for v, k in d.items():
        reverselookup[v].append(k)