如何设置默认值的所有字典对象的关键字在 Python?

我知道您可以使用 setdefault (key,value)来设置给定键的默认值,但是有没有一种方法可以将所有键的默认值设置为在创建一个 dict 之后的某个值?

换句话说,我希望 dict 为每个尚未设置的键返回指定的默认值。

135221 次浏览

在创造了它之后,没有。但是首先可以使用 defaultdict,它在初始化时设置默认值。

defaultdict 可以为你做类似的事情。

例如:

>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d
defaultdict(<class 'list'>, {})
>>> d['new'].append(10)
>>> d
defaultdict(<class 'list'>, {'new': [10]})

你可以用 defaultdict代替你的旧字典:

>>> from collections import defaultdict
>>> d = {'foo': 123, 'bar': 456}
>>> d['baz']
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'baz'
>>> d = defaultdict(lambda: -1, d)
>>> d['baz']
-1

这里的“诀窍”是一个 defaultdict可以用另一个 dict初始化 保持正常 dict中的现有值:

>>> d['foo']
123

这就是你想要的吗:

>>> d={'a':1,'b':2,'c':3}
>>> default_val=99
>>> for k in d:
...     d[k]=default_val
...
>>> d
{'a': 99, 'b': 99, 'c': 99}
>>>


>>> d={'a':1,'b':2,'c':3}
>>> from collections import defaultdict
>>> d=defaultdict(lambda:99,d)
>>> d
defaultdict(<function <lambda> at 0x03D21630>, {'a': 1, 'c': 3, 'b': 2})
>>> d[3]
99

如果你问的是实际意义上的问题,我会提供另一种答案。

你说你想要一个指定的值,你不说你想要 准备好了的值同时,像 defaultdict做的。这样做可以:

class DictWithDefault(dict):
def __init__(self, default, **kwargs):
self.default = default
super(DictWithDefault, self).__init__(**kwargs)


def __getitem__(self, key):
if key in self:
return super(DictWithDefault, self).__getitem__(key)
return self.default

使用方法如下:

d = DictWIthDefault(99, x=5, y=3)
print d["x"]   # 5
print d[42]    # 99
42 in d        # False
d[42] = 3
42 in d        # True

或者,您可以使用标准的 dict,如下所示:

d = {3: 9, 4: 2}
default = 99
print d.get(3, default)  # 9
print d.get(42, default) # 99

使用默认设置

from collections import defaultdict
a = {}
a = defaultdict(lambda:0,a)
a["anything"] # => 0

这对于这样的情况非常有用,其中每个键的默认值设置为0:

results ={ 'pre-access' : {'count': 4, 'pass_count': 2},'no-access' : {'count': 55, 'pass_count': 19}
for k,v in results.iteritems():
a['count'] += v['count']
a['pass_count'] += v['pass_count']

您可以使用以下类。只需将0更改为您喜欢的任何默认值即可。该解决方案在 Python 2.7中进行了测试。

class cDefaultDict(dict):
# dictionary that returns zero for missing keys
# keys with zero values are not stored


def __missing__(self,key):
return 0


def __setitem__(self, key, value):
if value==0:
if key in self:  # returns zero anyway, so no need to store it
del self[key]
else:
dict.__setitem__(self, key, value)