2012-02-14 11 views
26

En Python lo que es la forma más eficiente de hacer esto:Tecla de acceso dict y volver Ninguno si no existe

my_var = some_var['my_key'] | None 

decir. asigne some_var['my_key'] a my_var si some_var contiene 'my_key', de lo contrario, haga my_var sea None.

+1

¿Qué quiere decir con "si existe"? ¿Puede el nombre 'some_var' ser indefinido en algunos casos? –

+1

Acabo de editarlo - para aclararlo - Estoy tratando de verificar la existencia de una clave en un diccionario esencialmente –

+0

Apuesto a que esto ya se ha preguntado ... –

Respuesta

37

Python lanzará una KeyError si la clave no existe en el diccionario, por lo que no puede escribir su código de la misma manera que su JavaScript. Sin embargo, si está operando específicamente con dicts como en su ejemplo, hay una muy buena función mydict.get('key', default) que intenta obtener la clave del diccionario y devuelve el valor predeterminado si la clave no existe.

Si solo quiere que el valor predeterminado sea None, no necesita pasar explícitamente el segundo argumento.

Según lo que contenga su dict y la frecuencia con la que espera acceder a las claves no configuradas, también puede interesarle usar el defaultdict del paquete collections. Esto toma una fábrica y la usa para devolver nuevos valores del método mágico __missing__ cada vez que accede a una clave que de otro modo no se ha establecido explícitamente. Es particularmente útil si se espera que su dict contenga solo un tipo.

from collections import defaultdict 

foo = defaultdict(list) 
bar = foo["unset"] 
# bar is now a new empty list 

N.B. los documentos (para 2.7.13) afirman que si no pasa un argumento al defaultdict, devolverá None para las claves no configuradas. Cuando lo probé (el 2.7.10, es justo lo que sucedió que tuve instalado), eso no funcionó y recibí un KeyError. YMMV.Alternativamente, puede utilizar una lambda: defaultdict(lambda: None)

+2

** KeyError ** es lo que se lanza al acceder a una clave que no existe en el diccionario. – farthVader

2
try: 
    my_var = some_var 
except: 
    my_var = None 

Pero honestamente esto probablemente no llega a la esencia de lo que estamos tratando de hacer ... Necesitamos más contexto para responder más plenamente.

+0

Acabo de añadir una aclaración - some_var es en realidad un diccionario y quiero asegurarme de que la clave existe en él. De lo contrario, use None –

1

En python "|" se traduce a "o", por lo que:

my_var = una_variable o Ninguno

Editar: ha editado su mensaje inicial. La forma correcta de hacer lo que quieres es:

my_var = some_var.get('my_key', None) 
+0

Ninguno es inútil, por defecto es None -> http : //docs.python.org/library/stdtypes.html#typesmapping – Fred

+0

Es solo un ejemplo para ilustrar el uso de dict.get. –

17

Usted está buscando el método de dictget().

my_var = some_var.get('some_key') 

El método get() devolverá el valor asociado con 'some_key', si existe un valor tal. Si la clave no está presente, se devolverá None.

7

Suponiendo some_var es un diccionario, necesita dict.get():

my_var = some_var.get('my_key') 

Este resultado por defecto es None si my_key no se encuentra, pero se puede suministrar un valor predeterminado diferente:

my_var = some_var.get('my_key', default) 
6

Lo bueno del método .get() es que realmente puede definir un valor para devolver en caso de que la clave no exista.

my_dict = { 1: 'one', 2: 'two' } 
print my_dict.get(3, 'Undefined key') 

imprimirían.

Undefined key 

Esto es muy útil no sólo para propósitos de depuración, sino también al analizar JSON (en mi experiencia, por lo menos), y se debe preferir el uso get() sobre [] tanto como sea posible.

Cuestiones relacionadas