如何在递归字典中搜索键的值?

时间:2017-06-29 01:19:47

标签: python dictionary recursion

我编写了一个递归函数来查找给定dictkey的值。 但我认为应该有一个更易读的版本。这是代码块。

def findvalue(_dict, target):
    for key, values in _dict.items():
        if 'dict' in str(type(values)):
            return findvalue(values, target)
        elif key == target:
            return values
        else:
            print("no such key")

是否有任何一行版本或使用yield(对此不确定)?

修改:基于Recursive functions and lists appending/extending和评论中的想法,我修改了函数以按给定键查找所有匹配的值

def find_all_value(_dict, target, values=None):
    for key, values in _dict.items():
        #case 1: it is a dictionary but not match the key
        if isinstance(values, dict) and key!=target:
            return find_all_value(values, target)
        #case 2: it is a dictionary but match the key -> put it in result
        elif isinstance(values, dict) and key==target:
            return [values] + find_all_value(values, target)
        #case 3: it is not dictionary and match the key -> put it in result
        elif key==target:
            return [values]

2 个答案:

答案 0 :(得分:2)

查找递归python dictionnary的第一个键(在广度优先搜索中找到)的值。

你可以这样做:

<meta charset="utf-8">

示例:

def find_value(_dict, key):
    stack = [(None, _dict)]
    while len(stack) != 0:
        _key, val = stack.pop(0)
        if val is not _dict and _key == key:
            return val
        if isinstance(val, dict):
            for k, v in val.items():
                stack.append((k, v))

输出:

d = {'c': {'d': 3, 'e': 4}, None: 0, 'b': 2, 'a': 1}

print('None:', find_value(d, None))
print('c:', find_value(d, 'c'))
print('e:', find_value(d, 'e'))
print('a:', find_value(d, 'a'))

答案 1 :(得分:0)

编辑:

通过列表理解递归搜索(嵌套)字典:

def findvalue(d, key):

    l = [e for e in [findvalue(e, key) for e in [d[k] for k in d.keys() if type(d[k])==dict]] if e]
    l.append(d[key]) if key in d else l
    return l

^返回(嵌套)每个匹配(嵌套)dict键的值列表。


简化版本打印而不是返回每个匹配:

def findvalue(d, key):

    [findvalue(e, key) for e in [d[k] for k in d.keys() if type(d[k])==dict]]
    if key in d: print(d[key])

^只显示每个匹配键的值    遇到了。


使用以下方式进行测试:

d = {1:2, 3:4, 5:{6:7,8:9, 99:{100:101}}, 10:11}



<击>     def findvalue(dict,key,target):         如果dict [key] == target:返回True         返回False

测试它:

dict = {1:2,3:4}
findvalue(dict,3,4)

<击>