2012-02-04 16 views
45

So che è possibile utilizzare setdefault (chiave, valore) per impostare il valore predefinito per un determinato tasto, ma esiste un modo per impostare i valori predefiniti di tutti i tasti su un valore dopo aver creato un dict?Come impostare il valore predefinito su tutte le chiavi di un oggetto dict in python?

In un altro modo, voglio che il ditt restituisca il valore predefinito specificato per ogni tasto che non ho ancora impostato.

+1

Qual è questo insieme di "tutte le chiavi" di cui si sta parlando? C'è una quantità infinita di potenziali chiavi, anche se ti limiti ad es. stringhe. Potresti fare un esempio? – delnan

+0

puoi usare il metodo get, 'a.get (k [, x]) a [k] se k in a, else x' – Anycorn

+0

Alcuni aiuti nella direzione opposta: http://stackoverflow.com/questions/7688453/ how-to-fix-default-values-from-a-dictionary-pythonically – aitchnyu

risposta

77

È possibile sostituire il vecchio dizionario 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 

Il "trucco" è che un defaultdict possono essere inizializzati con un altro dict. Ciò significa che a preservare i valori esistenti nel vostro normale dict:

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

+1 per la chiave 'lambda', ero bloccato lì. – Droogans

+1

C'è un modo per farlo funzionare con 'get' e metodi o costrutti simili come' in'? – 0xc0de

+0

Non basta 'defaultdict (lambda: -1)' abbastanza? a cosa serve il 'd'? – yiwei

1

Non dopo averlo creato, no. Ma potresti usare uno defaultdict in primo luogo, che imposta i valori predefiniti quando lo si inizializza.

1

defaultdict può fare qualcosa del genere per voi.

Esempio:

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

defaultdict può aiutare l'OP ma l'esempio è irrilevante ..... – 0xc0de

2

E 'questo ciò che si vuole:

>>> 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 per la chiave 'lambda', ero bloccato lì. – Droogans

4

Nel caso in cui in realtà dire che cosa ti sembra di chiedere, fornirò questo risposta alternativa

Tu dici che vuoi il dict per ritorno un valore specificato, non si dice che si desidera impostare che apprezzano allo stesso tempo, come defaultdict fa. Questo farà in modo:

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 

Usa come questo:

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 

In alternativa, è possibile utilizzare uno standard dict come questo:

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

Usa defaultdict

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

Questo è molto noi eful per caso come questo, in cui i valori di default per ogni tasto è impostato come 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

Molto conciso, grazie! – kmarsh

1

È possibile utilizzare la classe seguente. Basta cambiare lo zero con qualsiasi valore predefinito che ti piace. La soluzione è stata testata in 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) 
Problemi correlati