【问题标题】:Find a string as value in a dictionary of dictionaries and return its key在字典字典中查找字符串作为值并返回其键
【发布时间】:2013-08-08 07:22:19
【问题描述】:

我需要编写一个函数来完成以下工作

在字典中找到一个字符串作为值并返回它的键 (如果在主字典中找到第一个键,如果在子字典中找到第二个键)。

源代码

这是我尝试实现的功能,但它工作不正确,因为我找不到如何将列表转换为字典的任何答案,因为在这种情况下会发生以下错误

对于 v, k in l: ValueError: 需要超过 1 个值才能解压

def GetKeyFromDictByValue(self, dictionary, value_to_find):
    """"""

    key_list = [k for (k, v) in dictionary.items() if v == value_to_find]
    if key_list.__len__() is not 0:
        return key_list[0]
    else:
        l = [s for s in dictionary.values() if  ":" in str(s)]
        d = defaultdict(list)
        for v, k in l:
            d[k].append(v)

        print d

dict = {'a': {'a1': 'a2'}, "aa": "aa1", 'aaa': {'aaa1': 'aaa2'}}
print GetKeyFromDictByValue(dict, "a2")

我必须在 Python 2.5 上执行此操作

【问题讨论】:

  • 使用len(key_list) key_list.__len__()。非零值是布尔真值:if len(key_list): 就足够了。
  • 你不应该将你的变量命名为dict;这掩盖了内置类型,实际上阻止您在此处的值上使用isinstance(),因为您现在无法测试该类型。

标签: python list dictionary python-2.5


【解决方案1】:

您创建了一个字典值的列表,然后尝试循环遍历它,就好像它已经包含这些字典的键和值一样。也许您想遍历每个匹配的字典?

l = [v for v in dictionary.values() if  ":" in str(v)]
d = defaultdict(list)
for subdict in l:
    for k, v in subdict.items():

我会改为扁平化结构:

def flatten(dictionary):
    for key, value in dictionary.iteritems():
        if isinstance(value, dict):
            # recurse
            for res in flatten(value):
                yield res
        else:
            yield key, value

然后只需搜索:

def GetKeyFromDictByValue(self, dictionary, value_to_find):
    for key, value in flatten(dictionary):
        if value == value_to_find:
            return key

演示:

>>> sample = {'a': {'a1': 'a2'}, "aa": "aa1", 'aaa': {'aaa1': 'aaa2'}}
>>> GetKeyFromDictByValue(None, sample, "a2")
'a1'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 2020-12-03
    • 2014-05-18
    • 1970-01-01
    • 2015-03-10
    • 1970-01-01
    • 2016-02-29
    相关资源
    最近更新 更多