2012-02-04 53 views
45

我知道你可以使用setdefault(key,value)为给定的键设置默认值,但是有没有办法在创建dict之后将所有键的默认值设置为某个值?如何将默认值设置为Python中的字典对象的所有键?

换句话说,我想让字典为我还没有设置的每个键返回指定的默认值。

+1

你在说什么这套“所有钥匙”?即使您将自己限制为例如无限量的潜在按键字符串。你能举个例子吗? – delnan 2012-02-04 09:44:08

+0

你可以使用get方法,'a.get(k [,x])a [k]如果k在a中,否则x' – Anycorn 2012-02-04 09:46:02

+0

反方向有些帮助:http://stackoverflow.com/questions/7688453/如何修复默认值从字典pythonically – aitchnyu 2012-02-04 10:27:11

回答

77

您可以用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 
+2

+1的'lambda'键,我卡在那里。 – Droogans 2012-02-23 22:30:18

+1

有没有什么办法可以使用'get'和类似的方法或类似'in'的构造来实现这个功能? – 0xc0de 2015-12-17 09:55:51

+0

不仅仅是'defaultdict(lambda:-1)'吗? 'd'是什么意思? – yiwei 2016-02-02 03:20:16

1

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

1

defaultdict可以为你做这样的事情。

例子:

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

defaultdict可以帮助OP,但这个例子是无关紧要的..... – 0xc0de 2015-12-17 10:06:04

2

这是你想要的东西:

>>> 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

+1为'lambda'键,我被困在那里。 – Droogans 2012-02-23 22:29:50

4

如果你实际上意味着你似乎要问什么,我会提供这替代答案。

你说你想要的字典来指定的值,你不说你要设置,在价值的同时,像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 
6

使用defaultdict

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

这是我们eful的情况下,像这样,在默认值每个键被设置为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

非常简洁,谢谢! – kmarsh 2014-05-19 15:27:06

1

您可以使用下面的类。只需将零更改为您喜欢的任何默认值即可。该解决方案在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) 
相关问题