关于字典:如何在python中为dict对象的所有键设置默认值?

How to set default value to all keys of a dict object in python?

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

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


您可以用defaultdict替换旧词典:

1
2
3
4
5
6
7
8
9
>>> 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中的现有值:

1
2
>>> d['foo']
123


使用默认dict

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

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

1
2
3
4
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']


如果你的意思是你想问的,我会提供另一个答案。

您说希望dict返回一个指定的值,而不是像defaultdict那样同时设置该值。这样做可以:

1
2
3
4
5
6
7
8
9
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

使用方法如下:

1
2
3
4
5
6
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

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


这就是你想要的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
>>> 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


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

1
2
3
4
5
6
7
8
9
10
11
12
13
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)

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

例子:

1
2
3
4
5
6
7
>>> from collections import defaultdict
>>> d = defaultdict(list)
>>> d
defaultdict(<class 'list'>, {})
>>> d['new'].append(10)
>>> d
defaultdict(<class 'list'>, {'new': [10]})


不是在创建它之后,而是可以首先使用defaultdict,它在初始化时设置默认值。