2013-03-22 73 views
0

的字典修改值假设我有一个看起来像这样的列表,但在深度和复杂性可能会有所不同:Python。在未知深度

inc = {'root': 10, 
    'values': { 
     'left': {8: { 
      'left': { 
       6: { 
        'left': 5, 
        'right': 11} 
        }, 
      'right': { 
        10: { 
        'left': 2, 
        'right': 11} 
       }}}, 
     'right' : { 
        12: { 
        'left': 5, 
        'right': 20} 
        }}} 

我需要做的是遍历它,找到最低的左值和最左边的值(即,通过访问字典的'左'元素达到的值)并交换它们。递归遍历字典以查找值不是问题。问题是在确定需要更改什么之后找到必要的值。

功能用于迭代:

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

值得注意的是,这是一种在字典中存储二叉树的奇怪方法。我觉得使用嵌套列表更自然,或者做一些类似'{'value':5,'left':{'value':4},'right':{'value':7,'left' :{'value':12}}}'。 – Dougal 2013-03-22 23:05:59

回答

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'] 

我我不确定你的最左边的的定义,但如果它意味着最少的深度键等于“左”,那么你的代码是错误的,因为它只是抓取在深度优先遍历期间找到的第一个值。为了克服这个问题,你可以保持当前的深度并比较它,以确定是否应该覆盖最左边的值。

+0

最左边是最深的键,只有走左才能到达凸轮。所以代码是正确的。感谢您的答案,它的工作。 – 2013-03-23 09:47:15

+0

啊,好吧,那会好起来的!我一直在考虑树从左到右的增长,因为它是由代码中的Python字典表示的:) – tomasz 2013-03-23 15:26:01