Max*_*rim 1 python recursion hash dictionary
我想在Python中打印嵌套哈希,由此:
example_dict = {
'key1' : 'value1',
'key2' : {
'key2a': 'value2a'
},
'key3' : {
'key3a': {
'key3aa': 'value3aa',
'key3ab': 'value3ab',
'key3ac': 'value3ac'
},
'key3b': [
'value3b1',
'value3b2'
]
},
}
Run Code Online (Sandbox Code Playgroud)
这样的事情:
key1 value1
key2 key2a value2a
key3 key3a key3aa value3aa
key3 key3a key3ab value3ab
key3 key3a key3ac value3ac
key3 key3b value3b1
key3 key3b value3b2
Run Code Online (Sandbox Code Playgroud)
我对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)
Run Code Online (Sandbox Code Playgroud)
我正在尝试将每行添加到列表中以便以后能够使用它,但我认为我没有使用我的共享变量(行)的正确方法,因为在每个字典中,递归调用是用另一个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
Run Code Online (Sandbox Code Playgroud)
什么是Pythonic方法呢?
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,))
Run Code Online (Sandbox Code Playgroud)
需要注意的一点是需要从递归的生成器中重新生成结果.这是通过以下方式完成的:
yield from recursive(item, so_far)
Run Code Online (Sandbox Code Playgroud)
这相当于:
for i in recursive(item, so_far):
yield i
Run Code Online (Sandbox Code Playgroud)
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)
Run Code Online (Sandbox Code Playgroud)
key1 value1
key2 key2a value2a
key3 key3a key3aa value3aa
key3 key3a key3ab value3ab
key3 key3a key3ac value3ac
key3 key3b value3b1
key3 key3b value3b2
Run Code Online (Sandbox Code Playgroud)