How to set default value to all keys of a dict object in python?
我知道您可以使用set default(key,value)为给定的key设置默认值,但是在创建dict之后,是否有方法将所有key的默认值设置为某个值?
换一种说法,我希望dict为我尚未设置的每个键返回指定的默认值。
您可以用
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 |
号
这里的"技巧"是一个
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返回一个指定的值,而不是像
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 |
。
或者,您可以使用这样的标准
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) |
例子:
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]}) |
不是在创建它之后,而是可以首先使用