【问题标题】:Update values in a Nested Dictionary in Python在 Python 中更新嵌套字典中的值
【发布时间】:2016-01-12 15:29:18
【问题描述】:

我有一个这样的嵌套 python 字典

{  
 "node":{  
  "node1":{  
     "node1.1":{  

     },
     "node1.2":{  

     }
  },
  "node2":{  
     "node2.1":{  
        "node2.1.1":{  

        }
     }
  }
 }
}

我想要实现的是一个树结构,我可以在其中将子元素添加到任何父元素。有没有办法使用键更新嵌套字典的值?

【问题讨论】:

  • 您可以实现一个简单的tree class 并尝试跟踪树以查找您想要的特定key
  • 你应该看看 dict.get 和 dict.update,它们可能对你有帮助。但是,您的问题非常广泛,我认为无法做出正确的答案。
  • Ajai - 你需要的是一个递归函数,它剥离字典的每一层(使用 isinstance(value, dict) 检查类型)并不断更新嵌套字典并将其更新到主字典。请发布非常具体的问题,我可以为您提供确切的代码。

标签: python dictionary nested-loops


【解决方案1】:

如果你不知道树中的路径,你可以这样做

my_tree={  
     "node":{
         "node1":{
             "node1.1":{},
             "node1.2":{}
             },
         "node2":{
             "node2.1":{
                 "node2.1.1":{}
                 }
             }
         }
     }

def update_tree(tree,key,value):
    """Return true if update, else false"""
    if key in tree:
        tree[key].update(value)
        return True
    for branch in tree.values():
        if update_tree(branch,key,value):
            return True
    return False

测试

>>> import pprint
>>> pprint.pprint(my_tree)
{'node': {'node1': {'node1.1': {}, 'node1.2': {}},
          'node2': {'node2.1': {'node2.1.1': {}}}}}
>>> update_tree(my_tree,"node2.1",{"node2.1.2":{}})
True
>>> pprint.pprint(my_tree)
{'node': {'node1': {'node1.1': {}, 'node1.2': {}},
          'node2': {'node2.1': {'node2.1.1': {}, 'node2.1.2': {}}}}}
>>> 

编辑

实现一个简单的树类,应该是这样的

class Tree(object):
    def __init__(self,value=None,*branchs):
        self.value  = value
        self.branchs = list(branchs)

    def update(self,parent,value):
        if self.value == parent:
            self.branchs.append(value)
            return True
        for branch in self.branchs:
            if branch.update(parent,value):
                return True
        return False

    def printTree(self,nivel=0):
        print( " "*nivel + str(self.value))
        for branch in self.branchs:
            branch.printTree(nivel+4)


my_tree_class=Tree("node",
                   Tree("node1",
                        Tree("node1.1"),
                        Tree("node1.2")
                        ),
                   Tree("node2",
                        Tree("node2.1",
                             Tree("node2.1.1")
                             )
                        )
                   )

测试

>>> my_tree_class.printTree()
node
    node1
        node1.1
        node1.2
    node2
        node2.1
            node2.1.1
>>> my_tree_class.update("node2.1",Tree("node2.1.2"))
True
>>> my_tree_class.printTree()
node
    node1
        node1.1
        node1.2
    node2
        node2.1
            node2.1.1
            node2.1.2
>>>     

树类的细节取决于你想要的树的种类

【讨论】:

  • 我认为最好的方法是tree class
【解决方案2】:

这就是你要找的吗?

dict['node']['node1']['node1.2'] = 'new value'
dict
{'node': {'node1': {'node1.2': 'new value', 'node1.1': {}}, 'node2': {'node2.1': {'node2.1.1': {}}}}}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-30
    • 2011-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多