【问题标题】:Adding to a dict using a list of key strings as path使用键字符串列表作为路径添加到字典
【发布时间】:2013-04-24 09:33:04
【问题描述】:

我有以下字典:

aDict = {
    "a" : {
        "b" : {
            "c1" : {},
            "c2" : {},
        }
    }
}

第二个字典:

aSecondDict = { 
    "d1" : {},
    "d2" : {},
    "d3" : {},
}

和一个“路径”元组:

path = ( "a", "b", "c2" )

我现在想在元组提供的路径上将第二个字典添加到第一个字典中:

aResultDict = {
    "a" : {
        "b" : {
            "c1" : {},
            "c2" : {
                "d1" : {},
                "d2" : {},
                "d3" : {},
            },
        }
    }
}

实现这一点的pythonic方法是什么?

【问题讨论】:

  • 你能修一下你的字典吗

标签: python dictionary path key


【解决方案1】:

您可以使用reduce1 获取字典并使用dict.update 将新内容放入其中:

reduce(lambda d,key: d[key],path,aDict).update(aSecondDict)

如果你愿意,你甚至可以变得更聪明:

reduce(dict.__getitem__,path,aDict).update(aSecondDict)

我想应该注意的是,这两种方法略有不同。后者强制aDict 只包含更多字典(或dict 子类),而前者允许任何具有__getitem__ 方法的东西在aDict 中。 As noted in the comments,你也可以使用:

reduce(dict.get,path,aDict).update(aSecondDict)

但是,如果您尝试遍历路径中不存在的“链接”而不是KeyError,则此版本将引发AttributeError,因此我不太喜欢它。此方法还强制沿路径的每个值都是dictdict 子类。

1reduce 是 python2.x 的内置函数。从 python2.6 开始,它也可以作为 functools.reduce 使用。想要与 python3.x 兼容的代码应该尝试使用functools.reduce,因为在 python3.x 中删除了内置函数

【讨论】:

  • reduce(dict.get, path, d)
  • @jamylak -- 对。初始化程序总是最后。谢谢。
  • 另外,如果 OP 想要一份副本,他可以使用 copy.deepcopy 然后执行此操作
  • @jamylak -- 我想我更喜欢dict.__getitem__dict.get,因为前者会在路径不好时引发KeyError,但后者会引发AttributeError(我认为)似乎没那么有用。
  • @jamylak -- 我从来没有对我的理智做出任何保证:-)
猜你喜欢
  • 2022-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多