在给定索引和值列表的嵌套 Python 字典中设置值

新手上路,请多包涵

我正在尝试以编程方式在字典中设置一个值,可能是嵌套的,给定一个索引列表和一个值。

因此,例如,假设我的索引列表是:

 ['person', 'address', 'city']

价值是

'New York'

结果我想要一个像这样的字典对象:

 { 'Person': { 'address': { 'city': 'New York' } }

基本上,该列表表示进入嵌套字典的“路径”。

我想我可以自己构建字典,但我遇到的问题是如何设置值。显然,如果我只是手动为此编写代码,那将是:

 dict['Person']['address']['city'] = 'New York'

但是,如果我只有索引和值的列表,我该如何索引到字典中并以编程方式设置值呢?

Python

原文由 peterk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 624
2 个回答

这样的事情可能会有所帮助:

 def nested_set(dic, keys, value):
    for key in keys[:-1]:
        dic = dic.setdefault(key, {})
    dic[keys[-1]] = value

你可以这样使用它:

 >>> d = {}
>>> nested_set(d, ['person', 'address', 'city'], 'New York')
>>> d
{'person': {'address': {'city': 'New York'}}}

原文由 Bakuriu 发布,翻译遵循 CC BY-SA 3.0 许可协议

我自由地扩展了 Bakuriu 的答案中的 代码。因此,对此的赞成是可选的,因为他的代码本身就是一个机智的解决方案,这是我没有想到的。

 def nested_set(dic, keys, value, create_missing=True):
    d = dic
    for key in keys[:-1]:
        if key in d:
            d = d[key]
        elif create_missing:
            d = d.setdefault(key, {})
        else:
            return dic
    if keys[-1] in d or create_missing:
        d[keys[-1]] = value
    return dic

create_missing 设置为 True 时,您要确保只设置已经存在的值:

 # Trying to set a value of a nonexistent key DOES NOT create a new value
print(nested_set({"A": {"B": 1}}, ["A", "8"], 2, False))
>>> {'A': {'B': 1}}

# Trying to set a value of an existent key DOES create a new value
print(nested_set({"A": {"B": 1}}, ["A", "8"], 2, True))
>>> {'A': {'B': 1, '8': 2}}

# Set the value of an existing key
print(nested_set({"A": {"B": 1}}, ["A", "B"], 2))
>>> {'A': {'B': 2}}

原文由 JackLeEmmerdeur 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题