有没有办法使用另一个dict在Python dict上设置多个默认值?

时间:2009-05-11 20:01:46

标签: python dictionary

假设我在Python中有两个dicts:

mydict = { 'a': 0 }

defaults = {
    'a': 5,
    'b': 10,
    'c': 15
}

我希望能够使用mydict中的默认值展开defaults,以便'a'保持不变,但填写'b'和'c'。我知道{ {3}}和dict.setdefault(),但每个只执行我想要的一半 - dict.setdefault(),我必须遍历defaults中的每个变量;但使用dict.update()defaults会在mydict中删除任何预先存在的值。

我是否有一些我没有在Python中内置的功能可以做到这一点?如果没有,是否有更多Pythonic方式编写循环来重复调用dict.setdefaults()而不是:

for key in defaults.keys():
    mydict.setdefault(key, defaults[key])

上下文:我在Python中编写了一些控制如何解析XML树的数据。每个节点都有一个dict(即,如何处理每个节点),我宁愿我写的数据是稀疏的,但是用默认值填充。示例代码只是一个示例...实际代码在默认字典中有更多的键/值对。

(我意识到整个问题只是一个小问题,但它一直困扰着我,所以我想知道是否有更好的方法来做到这一点,我不知道。)

5 个答案:

答案 0 :(得分:8)

难道你不能让mydict成为默认副本,这样,mydict会有所有正确的值开始吗?

mydict = default.copy()

答案 1 :(得分:5)

你可以像Python的collections.DefaultDict一样工作:

class MultiDefaultDict(dict):
    def __init__(self, defaults, **kwargs):
        self.defaults = defaults
        self.update(kwargs)
    def __missing__(self, key):
        return self.defaults[key]

>>> mydict2 = MultiDefaultDict(defaults, a=0)
>>> mydict2['a']
0
>>> mydict2['b']
10
>>> mydict2
{'a': 0}

到目前为止发布的其他解决方案复制了所有默认值;这个人按要求分享他们。您可能希望也可能不希望覆盖其他dict方法,如__contains __(),__ item __(),items(),keys(),values() - 此处定义的此类仅迭代非默认项。

答案 2 :(得分:4)

如果你不介意在这个过程中创建一个新的字典,这将解决问题:

newdict = dict(defaults)
newdict.update(mydict)

现在newdict包含您需要的内容。

答案 3 :(得分:0)

defaults.update(mydict)

答案 4 :(得分:0)

我个人喜欢附加字典对象。它主要像字典一样工作,除了你必须首先创建对象。

class d_dict(dict):
    'Dictionary object with easy defaults.'
    def __init__(self,defaults={}):
        self.setdefault(defaults)           
    def setdefault(self,defaults):
        for key, value in defaults.iteritems():
            if not key in self:
                dict.__setitem__(self,key,value)

这提供了与dict类型完全相同的功能,除了它覆盖了setdefault()方法并将获取包含一个或多个项目的字典。您可以在创建时设置默认值。

这只是个人偏好。据我所知,dict.setdefault()所做的就是设置尚未设置的项目。所以最简单的选择可能是:

new_dict = default_dict.copy()
new_dict.update({'a':0})

但是,如果你不止一次这样做,你可以用它来制作一个功能。此时,使用自定义dict对象可能更容易,而不是不断向字典中添加默认值。