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

76 投票
7 回答
152445 浏览
提问于 2025-04-17 12:18

我知道可以用setdefault(key, value)这个方法为某个特定的键设置默认值,但有没有办法在创建字典之后,把所有键的默认值都设置成某个值呢?

换句话说,我想让这个字典在我还没设置的每个键上都返回一个指定的默认值。

7 个回答

7

如果你真的是在问你看起来想问的问题,我就给你提供一个不同的答案。

你说你想让字典(dict)返回一个指定的值,但你没有说你想同时设置这个值,就像 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
15

使用 defaultdict

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']
136

你可以用一个叫做 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

撰写回答