Skip to main content
 首页 » 编程设计

Python递归打印嵌套哈希

2025年05月04日15shangdawei

我想在 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) 

我正在尝试将每一行添加到列表中以便以后使用它,但我认为我的共享变量(行)没有正确的方法,因为在每个字典中都进行了递归调用从相同深度的另一个字典键,所以我得到了这个:

 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 

执行此操作的 Pythonic 方法是什么?

请您参考如下方法:

使用 generator (yield 语句)你可以递归地这样做:

代码:

def recursive(src, so_far=()): 
    if isinstance(src, dict): 
        for key, value in src.items(): 
            yield from recursive(value, so_far + (key,)) 
    elif isinstance(src, list): 
        for item in src: 
            yield from recursive(item, so_far) 
    else: 
        yield ' '.join(so_far + (src,)) 

需要注意的一件事是需要重新生成递归到的生成器的结果。这是在这里使用:

yield from recursive(item, so_far) 

相当于:

for i in recursive(item, so_far): 
    yield i 

测试代码:

example_dict = { 
    'key1': 'value1', 
    'key2': { 
        'key2a': 'value2a' 
    }, 
    'key3': { 
        'key3a': { 
            'key3aa': 'value3aa', 
            'key3ab': 'value3ab', 
            'key3ac': 'value3ac' 
        }, 
        'key3b': [ 
            'value3b1', 
            'value3b2' 
        ] 
    }, 
} 
 
for line in recursive(example_dict): 
    print(line) 

结果:

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