如何将默认值设置为Python中的字典对象的所有键?
我知道你可以使用setdefault(key,value)为给定的键设置默认值,但是有没有办法在创build一个dict之后将所有键的默认值设置为某个值?
换句话说,我想让字典为我还没有设置的每个键返回指定的默认值。
你可以用一个defaultdict
replace你的旧字典:
>>> 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
如果你真的认为你似乎要问,我会提供这个替代的答案。
你说你想要字典返回一个指定的值,你不是说你想同时设置这个值,就像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
使用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']
这是你想要的吗:
>>> 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
不是在创build之后,没有。 但是,您可以首先使用defaultdict
,在初始化时设置默认值。
defaultdict
可以为你做这样的事情。
例:
>>> from collections import defaultdict >>> d = defaultdict(list) >>> d defaultdict(<class 'list'>, {}) >>> d['new'].append(10) >>> d defaultdict(<class 'list'>, {'new': [10]})
你可以使用下面的类。 只要将零改为您喜欢的任何默认值。 该解决scheme在Python 2.7中进行了testing。
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)