不存在时在字典中设置默认值

时间:2016-02-05 00:41:44

标签: python dictionary

我有字典,如果该密钥不存在,我想为其分配一个值。我发现自己经常写这个:

class Document(object):
    def __init__(properties):
        self.properties = properties
        self.properties['created']=properties.get('created',datetime.datetime.now())
        self.properties['foo']=properties.get('foo','bar')

有人建议这相当于:

        self.properties = {'created',datetime.datetime.now(),'foo':'bar'}
        self.properties.update(properties)

使用其中一个有什么好处吗? 我希望在一行中实现此赋值,但不幸的是update()方法不返回修改后的字典。是否有一个良好的高性能单线替代品?

2 个答案:

答案 0 :(得分:1)

您可以使用收藏模块中的defaultdict

from collections import defaultdict
>>> d=defaultdict(datetime.datetime.now)
>>> d['created']
datetime.datetime(2016, 2, 4, 16, 44, 42, 767328)

您还可以使用setdefault dict方法:

class Document(object):
    def __init__(self,properties):
        self.properties = properties
        self.properties.setdefault('created',datetime.datetime.now())

使用setdefault无法将其他dict值设置为datetime.datetime.now(),因此它可能更适合您。

答案 1 :(得分:1)

如果您能够使用Python 3.5,additional unpacking generalizations可以轻松实现:

class Document(object):
    def __init__(self, properties):
        self.properties = {'created': datetime.datetime.now(), **properties}

如果保证属性dict只有字符串键,您也可以在任何版本的Python中执行以下操作:

        self.properties = dict({'created': datetime.datetime.now()}, **properties)

虽然它有点难看,但对于任何版本的Python,你都可以获得与其他解包方案一样的效果:

from itertools import chain

...
        self.properties = dict(chain({'created': datetime.datetime.now()}.items(), properties.items()))

最后,如果这些都不是一个选项,您至少可以使用get避免单独的setdefault和商店操作:

        self.properties = properties
        properties.setdefault('created', datetime.datetime.now())

setdefault的行为类似于get,但如果没有现有密钥,它也会存储默认值。请注意,与基于get的版本一样,这样可以保持调用者提供的确切dict,对其进行变更,并且将来可能会被调用者变更。所有其他解决方案都避免这种情要解决getsetdefault的问题,请更改为:

        self.properties = properties.copy()
        self.properties.setdefault('created', datetime.datetime.now())