假设我有一个看起来像这样的列表,但可能会有不同的深度和复杂性:
inc = {'root': 10,
'values': {
'left': {8: {
'left': {
6: {
'left': 5,
'right': 11}
},
'right': {
10: {
'left': 2,
'right': 11}
}}},
'right' : {
12: {
'left': 5,
'right': 20}
}}}
我需要做的是遍历它,找到最左边的值和最左边的值(即通过访问字典的'left'元素达到的值)并交换它们。递归遍历字典以查找值不是问题。问题是在确定需要更改的内容后找到必要的值。
用于迭代的函数:
leftmost = 0
lowest = 0
def walk_dict(d):
global leftmost, lowest
for k,v in sorted(d.items()):
if isinstance(v, dict):
walk_dict(v)
else:
if k == 'left':
if leftmost == 0:
leftmost = v
if v < lowest:
lowest = v
答案 0 :(得分:1)
不要直接保留值,而是让词典保持它们,这样你就可以在最后交换值,例如:
[in the loop]
if k == 'left':
if not leftmost:
leftmost = d
if v < lowest['left']:
lowest = d
# swap
lefmost['left'], lowest['left'] = lowest['left'], lefmost['left']
此外,我不确定你对最左边的定义,但是如果它意味着最深的密钥等于“left”,那么你的代码就错了,因为它只是抓住了第一个找到的值。深度优先遍历。要解决这个问题,您可以保持当前深度并进行比较,以确定是否应覆盖最左边的值。