Python递归打印嵌套哈希

Python递归打印嵌套哈希,python,dictionary,recursion,hash,Python,Dictionary,Recursion,Hash,我想用Python打印嵌套哈希,如下所示: example_dict = { 'key1' : 'value1', 'key2' : { 'key2a': 'value2a' }, 'key3' : { 'key3a': { 'key3aa': 'value3aa', 'key3ab': 'value3ab', 'key3ac': 'value3ac'

我想用Python打印嵌套哈希,如下所示:

example_dict = {
    'key1' : 'value1',
    'key2' : {
        'key2a': 'value2a'
    },
    'key3' : {
        'key3a': {
            'key3aa': 'value3aa',
            'key3ab': 'value3ab',
            'key3ac': 'value3ac'
        },
        'key3b': [
            'value3b1',
            'value3b2'
        ]
    },
}
对这样的事情:

key1 value1
key2 key2a value2a
key3 key3a key3aa value3aa
key3 key3a key3ab value3ab
key3 key3a key3ac value3ac
key3 key3b value3b1
key3 key3b value3b2
我对Python不是很熟悉,几个小时后我仍然被卡住了

我目前正在使用此功能:

def recursive(src, res, line = ''):
    if isinstance(src, dict):
        for key, value in src.items():
            line += str(' ' + key)
            recursive(value, res, line)
    elif isinstance(src, list):
        for litem in src:
            recursive(litem, res, line)
    else:
        line += str(' ' + str(src))
        res.append(line)
我试图将每一行添加到一个列表中,以便以后使用,但我认为我没有正确的共享变量(行)方法,因为在每个dict中,递归调用都是使用同一深度级别的另一个dict键进行的,因此我得到了以下结果:

 key3 key3a key3aa value3aa
 key3 key3a key3aa key3ac value3ac
 key3 key3a key3aa key3ac key3ab value3ab
 key3 key3a key3b value3b1
 key3 key3a key3b value3b2
 key3 key2 key2a value2a
 key3 key2 key1 value1

什么样的python方法可以做到这一点?

我让它工作了,但它有点黑客,使用
append
添加一个元素,
extend
添加列表中的所有元素。希望有帮助:

def recursive(src, start=""):
    lst = []
    for k, v in src.items():
        new_start = "{} {}".format(start, k)
        if isinstance(v, dict):
            lst.extend(recursive(v, start=new_start))
        elif isinstance(v, list):
            lst.extend("{}: {}".format(new_start[1:] , val) for val in v)
        else:
            lst.append("{}: {}".format(new_start[1:] , v))

    return lst


items = recursive(example_dict)
for item in items:
    print(item)
输出:

 key1: value1
 key2 key2a: value2a
 key3 key3a key3aa: value3aa
 key3 key3a key3ab: value3ab
 key3 key3a key3ac: value3ac
 key3 key3b: value3b1
 key3 key3b: value3b2

我成功地实现了这一点,但它有点粗糙,使用
append
添加一个元素,
extend
添加列表中的所有元素。希望有帮助:

def recursive(src, start=""):
    lst = []
    for k, v in src.items():
        new_start = "{} {}".format(start, k)
        if isinstance(v, dict):
            lst.extend(recursive(v, start=new_start))
        elif isinstance(v, list):
            lst.extend("{}: {}".format(new_start[1:] , val) for val in v)
        else:
            lst.append("{}: {}".format(new_start[1:] , v))

    return lst


items = recursive(example_dict)
for item in items:
    print(item)
输出:

 key1: value1
 key2 key2a: value2a
 key3 key3a key3aa: value3aa
 key3 key3a key3ab: value3ab
 key3 key3a key3ac: value3ac
 key3 key3b: value3b1
 key3 key3b: value3b2
使用(语句)可以递归地执行以下操作:

代码: 需要注意的一点是,需要从递归到的生成器中重新生成结果。这是通过以下方式实现的:

yield from recursive(item, so_far)
这相当于:

for i in recursive(item, so_far):
    yield i
测试代码: 结果: 使用(语句)可以递归地执行以下操作:

代码: 需要注意的一点是,需要从递归到的生成器中重新生成结果。这是通过以下方式实现的:

yield from recursive(item, so_far)
这相当于:

for i in recursive(item, so_far):
    yield i
测试代码: 结果:
非常简单的递归实现

def pr(t, pref=''):
    for k, v in t.items():
        if isinstance(v, dict):
            pr(v, pref=(pref + k + ' '))
        elif isinstance(v, list):
            for el in v:
                if isinstance(el, str):
                    print(pref + ' ' + k + ' ' + el)
                else:
                    pr(el, pref=k + ' ')
        else:
            print(pref + ' ' + k + ' ' + v)

非常简单的递归实现

def pr(t, pref=''):
    for k, v in t.items():
        if isinstance(v, dict):
            pr(v, pref=(pref + k + ' '))
        elif isinstance(v, list):
            for el in v:
                if isinstance(el, str):
                    print(pref + ' ' + k + ' ' + el)
                else:
                    pr(el, pref=k + ' ')
        else:
            print(pref + ' ' + k + ' ' + v)

谢谢你的回答。我想知道是否值得在两个
for…:yield…
块的上下文中提到
yield from
构造?感谢您的回答和链接,这非常有帮助!我还研究了上面好奇号提到的的
收益率,但你的解决方案在我的案例中非常有效。再次感谢你!谢谢你的回答。我想知道是否值得在两个
for…:yield…
块的上下文中提到
yield from
构造?感谢您的回答和链接,这非常有帮助!我还研究了上面好奇号提到的
收益率,但你的解决方案在我的案例中非常有效。再次感谢你!