【问题标题】:Set the value of a nested dict of unknown depth? [duplicate]设置未知深度的嵌套字典的值? [复制]
【发布时间】:2017-04-19 14:39:57
【问题描述】:

所以我有一个充当各种“地图”的列表,以及一个从 JSON 文件中提取的字典。

对于这个例子,假设它们看起来像这样:

L = ['One', 'Two', 'Three']

D = {
    "One": {
        "Two": {
            "Three": {
                "Four": "String"
            }
        }
    }
}

我的游戏需要一个函数。

我将传递两件事:LObject

请注意,L 只会导致"Three",所以这就是我要替换的内容。不过,我可以用未知的债务替换 "Four" 或任何其他元素。

我要替换的可能是 stringlistdict,我可以将其替换为任何其他对象,包括 Nonebool

D 的结构需要保持不变,除了要替换的值。

【问题讨论】:

  • 那么,结果的例子是什么?
  • 这不是重复的。我想set 值,而不是检查它。

标签: python python-2.7 function dictionary


【解决方案1】:

此函数将字符串列表作为路径和对象来替换找到的值,对全局变量nested_dicts 进行操作。如果您想遵循功能范式,您可能需要相应地重写它。

def replace (path, replacement):
    pointer = nested_dicts
    try:
        for key in path[:-1]:
            pointer = pointer[key]
    except KeyError:
        return False
    pointer[path[-1]] = replacement
    return True

【讨论】:

  • 结果只是路径中的最终值,它是新值,D 的其余部分需要保持不变。
  • 我不明白你的说法“结果只是路径的最终值,它是新值”。这是您认为我的代码所做的,还是您希望它做的?它所做的是替换指定的值并保持其余部分不变。
  • 对不起,我在查看pointer的结果,不知道替换了原来的。
【解决方案2】:

这样的工作(pathLo 是替代品):

L = ['One', 'Two', 'Three']

D = {
    "One": {
        "Two": {
            "Three": {
                "Four": "String"
            }
        }
    }
}

def replace(path, o):
    cur = D
    for k in path[:-1]:
        cur = cur[k]
    cur[path[-1]] = o

replace(L, {'msg': 'good'})
print(D)

【讨论】:

  • 这与之前的答案相同,它不会返回我正在寻找的值。
  • 好吧,我真的试过了,它确实奏效了。发布完整代码
  • ..Ohh.. 它如何将值设置为D?我正在检查cur
  • cur = D :D。当然你也可以把它作为参数传入
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-04-30
  • 2011-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多