2012-05-09 12 views
5

Sto cercando un modo semplice per essere in grado di ottenere un valore da un dizionario, e se il suo non c'è, restituire la chiave che l'utente passava.Python Dizionario ritorno chiave richiesto se il valore non esiste

ad esempio:

>>> lookup = defaultdict(magic) 
>>> print lookup['DNE'] 
'DNE' 
>>> print lookup.get('DNE') 
'DNE' 
>>> print lookup['exists'] 
'some other value' 
>>> print lookup.get('exists') 
'some other value' 

Questi sarà sempre stringhe, ma in fondo io sono la creazione di una mappa di lingua e hanno bisogno di un modo semplice per ottenere un valore, se esiste restituirlo altro restituire la chiave.

C'è un modo semplice per farlo? O dovrei semplicemente estendere il comando e farlo manualmente.

+3

stavo per suggerire di estendere dict. Questo è l'approccio giusto IMO. – 10flow

risposta

2

dovrebbe essere possibile con una funzione lambda

from collections import defaultdict 
a = defaultdict((lambda : 'DNE')) 

Edit: Scusa ho letto male la domanda. Come già detto nel commento sopra. La strada da percorrere è l'estensione della classe dict.

>>> class mydict(dict): 
...  def __missing__(self,key): 
...   return key 
... 
>>> a = mydict() 
>>> a['asd'] 
'asd' 
+0

Non ho mai saputo che mancasse ... questo non funziona con a.get ('asd') – Nix

14

Non credo che lo defaultdict ti aiuti qui perché la funzione che genera il valore predefinito non ha accesso alla chiave richiesta.

Tuttavia si utilizza un dizionario di ordinaria e utilizzare get con un valore predefinito:

>>> lookup = {} 
>>> key = 'DNE' 
>>> lookup.get(key, key) 
'DNE' 
+0

Quindi, in breve, dovrei semplicemente estendere dict e override get e __item__? – Nix

+0

@Nix: se si desidera estendere la dict, penso che si possa usare la soluzione postata da Moe. La mia risposta mostra come puoi farlo senza estendere il ditt. –

+0

La tua soluzione non mi aiuta, sto cercando di evitare di dover usare con un valore predefinito. – Nix

2

Questo funziona in Python 2.7, almeno:

from collections import defaultdict 

class KeyAwareDefaultDict(defaultdict): 
    def __missing__(self, key): 
     if self.default_factory is None: 
      raise KeyError(key) 
     self[key] = value = self.default_factory(key) 
     return value 

lookup = KeyAwareDefaultDict((lambda key: key)) 

A differenza del dict standard defaultdict.get() sembra chiamare __missing__ troppo, in modo che rende una base migliore per l'estensione.

Problemi correlati