【问题标题】:Add key, values dynamically to a dictionary in python将键,值动态添加到python中的字典
【发布时间】:2019-11-21 10:43:42
【问题描述】:

给定列表中的路径(键),需要向给定字典添加值

data = {'personal_information': {'name' : {'first_name': 'Ashutosh'}}}
path_to_add = ['personal_information', 'address': 'state']
value = 'Delhi'

expected_output = {'personal_information': {'name' : {'first_name': 'Ashutosh'}}, 'address': {'state': 'Delhi'}}

【问题讨论】:

  • path_to_add 的值似乎与expected_output 不对应。结果不应该是{'personal_information': {'name' : {'first_name': 'Ashutosh'}, 'address': {'state': 'Delhi'}}}吗?

标签: python python-3.x algorithm recursion data-structures


【解决方案1】:

您可以使用递归来做到这一点:

data = {'personal_information': {'name' : {'first_name': 'Ashutosh'}}}
path_to_add = ['personal_information', 'address', 'state']
value = 'Delhi'

def addValue(dictionary, path, value):
    if len(path) > 1:
        if path[0] not in dictionary.keys():
            dictionary[path[0]] = {}
        addValue(dictionary[path[0]], path[1:], value)
    else:
        dictionary[path[0]] = value

print(data)
addValue(data, path_to_add, value)
print(data)

输出:

{'personal_information': {'name': {'first_name': 'Ashutosh'}}}
{'personal_information': {'name': {'first_name': 'Ashutosh'}, 'address': {'state': 'Delhi'}}}

【讨论】:

    【解决方案2】:

    您可以遍历分割到最后一个元素的路径,并使用setdefault() 处理对象以根据需要创建新对象。在循环之后,您将获得对可用于设置值的最后一个对象的引用:

    data = {'personal_information': {'name' : {'first_name': 'Ashutosh'}}}
    path_to_add = ['personal_information', 'address', 'state']
    value = 'Delhi'
    
    def add_to_dict(data, path, value):
        found = data
        for key in path[0:-1]:
            found = found.setdefault(key, {})
        found[path[-1]] = value
    
    add_to_dict(data, path_to_add, value)
    print(data)
    

    结果:

    {'personal_information': {'name': {'first_name': 'Ashutosh'}, 'address': {'state': 'Delhi'}}}
    

    【讨论】:

      猜你喜欢
      • 2023-03-08
      • 2020-04-12
      • 1970-01-01
      • 2019-03-29
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 2017-01-04
      • 1970-01-01
      相关资源
      最近更新 更多