1

我需要编写一个正在执行以下工作的函数

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

源代码

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

for v, k in l: ValueError: need more than 1 value to unpack

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 上执行此操作

4

1 回答 1

4

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

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'
于 2013-08-08T07:26:37.403 回答