【问题标题】:How to get a key from a list of dictionaries by its value [closed]如何按值从字典列表中获取键[关闭]
【发布时间】:2017-07-27 05:49:08
【问题描述】:

我有一个字典列表,我试图通过它的值来获取字典键:

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

如果字典列表中存在值5,我在这里尝试获取字典键。

【问题讨论】:

  • 如果多个键具有目标值,您期望什么结果?如果键在不同的字典中会有所不同吗?
  • @FallenAngel 这个问题是关于一个字典,而不是字典列表。
  • @ZeroPiraeus 这样吗?浏览列表并在每个字典中查找?

标签: python python-2.7 list dictionary reverse-lookup


【解决方案1】:

如果所有字典中的值都不同,则可以构建反向查找字典:

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)

【讨论】:

    【解决方案2】:

    您的问题含糊不清,正如 Peter DeGlopper 的 pointed out

    如果多个键具有目标值,您期望什么结果?如果键在不同的字典中会有所不同吗?

    但是,例如,如果您想要一个 2 元组列表 (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')]
    

    【讨论】:

    • 现在我当前的方案是从字典中获取特定键的值,其中它具有不同的键。
    【解决方案3】:
    for dic in list1:
        for key in dic:
            if dic[key] == search_value:
                print key
    

    【讨论】:

    • 请不要将变量命名为list。当名为list 的变量实际上是dict 时,情况更糟。
    • 这并不完全错误,但它的风格很糟糕。 #1,不要使用像list 这样的保留字作为变量名,这可能会以令人困惑的方式与内置方法发生冲突。 #2,list1 的内容是字典而不是列表,所以 for list in list1 既具有误导性,又有点不安全——只是因为很少直接使用 list 构造函数。它还假设子 dicts 恰好具有一个可比较的值,这可能准确也可能不准确。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多