2012-02-04 15 views
45

Sé que puede usar setdefault (clave, valor) para establecer el valor predeterminado para una clave determinada, pero ¿hay alguna forma de establecer los valores predeterminados de todas las claves en algún valor después de crear un dict?¿Cómo establecer el valor predeterminado para todas las claves de un objeto dict en python?

Dicho de otra manera, quiero que el dict devuelva el valor predeterminado especificado para cada tecla que aún no haya configurado.

+1

¿De qué es este conjunto de "todas las teclas" de las que está hablando? Hay una cantidad infinita de claves potenciales, incluso si se limita a, p. instrumentos de cuerda. ¿Podría dar un ejemplo? – delnan

+0

puede usar el método get, 'a.get (k [, x]) a [k] si k en a, else x' – Anycorn

+0

Algo de ayuda en la dirección inversa: http://stackoverflow.com/questions/7688453/ how-to-fix-default-values-from-a-dictionary-pythonically – aitchnyu

Respuesta

77

puede reemplazar su viejo diccionario con un 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 

El "truco" aquí es que un defaultdict se puede inicializar con otro dict. Esto significa que a preservar los valores existentes para su correcto dict:

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

+1 para la clave 'lambda', estaba atrapado allí. – Droogans

+1

¿Hay alguna manera de hacer que esto funcione con 'get' y métodos o construcciones similares a' in'? – 0xc0de

+0

¿No es suficiente 'defaultdict (lambda: -1)' suficiente? ¿Para qué es el 'd'? – yiwei

1

No después de crearlo, no. Pero podría usar un defaultdict en primer lugar, que establece valores predeterminados cuando lo inicializa.

1

defaultdict puede hacer algo como eso para usted.

Ejemplo:

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

defaultdict puede ayudar al OP, pero el ejemplo es irrelevante ..... – 0xc0de

2

Es esto lo que quiere:

>>> 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 para la clave 'lambda', estaba atrapado allí. – Droogans

4

En caso de que en realidad significa lo que parece que preguntar, voy a ofrecer este respuesta alternativa.

usted dice que quiere el dict a retorno un valor especificado, no se dice que desea establecer ese valor, al mismo tiempo, al igual que lo hace defaultdict. Esto lo hará:

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 

uso como esto:

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 

Como alternativa, puede utilizar un estándar dict así:

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

Uso defaultdict

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

Esto es muy nosotros Eful para casos como este, donde los valores predeterminados para cada clave se establece como 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

Muy conciso, ¡gracias! – kmarsh

1

Puede utilizar la siguiente clase. Simplemente cambie a cero el valor predeterminado que desee. La solución fue probada en 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) 
Cuestiones relacionadas