假设我在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(即,如何处理每个节点),我宁愿我写的数据是稀疏的,但是用默认值填充。示例代码只是一个示例...实际代码在默认字典中有更多的键/值对。
(我意识到整个问题只是一个小问题,但它一直困扰着我,所以我想知道是否有更好的方法来做到这一点,我不知道。)
答案 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对象可能更容易,而不是不断向字典中添加默认值。