Necesito una forma de obtener un valor de diccionario si su clave existe, o simplemente regresar None
, si no existe.
Sin embargo, Python genera una KeyError
excepción si busca una clave que no existe. Sé que puedo verificar la clave, pero estoy buscando algo más explícito. ¿Hay alguna manera de regresar None
si la clave no existe?
python
dictionary
key
nonetype
Spyros
fuente
fuente
.get(key)
lugar de[key]
Respuestas:
Puedes usar
dict.get()
que volverá
None
sikey is not in d
. También puede proporcionar un valor predeterminado diferente que se devolverá en lugar deNone
:fuente
None
si la clave está asignada explícitamenteNone
en el dict. Si eso no es lo que quieres, puedes usar algo comod.get(key) or "empty"
.[]
,""
,False
,0.0
o, de hechoNone
), entonces su solución sería volver siempre0
. Si esperaNone
s como valores, tendrá que hacer laif key in d:
verificación explícitamente."empty"
se devuelve sikey
no es una clave válidad
. No tiene nada que ver con el valorkey
asignado.Extrañar más. Está integrado en el lenguaje.
fuente
Utilizar
dict.get
Devuelve el valor de la clave si la clave está en el diccionario; de lo contrario, es el valor predeterminado. Si no se proporciona el valor predeterminado, el valor predeterminado es Ninguno, de modo que este método nunca genere un KeyError.
fuente
Debes usar el
get()
método de ladict
claseEsto resultará en
r == None
. Si la clave no se encuentra en el diccionario, la función get devuelve el segundo argumento.fuente
None
explícitamente. Es el predeterminado.Si desea una solución más transparente, puede subclasificar
dict
para obtener este comportamiento:fuente
defaultdict
es que crecerá cada vez que se solicite un elemento que aún no está allí. Esto no siempre es deseable.foo['bar']['test']['sss']
que regrese enNone
lugar de una excepción, después de una profundidad, comienza a dar enTypeError
lugar deKeyError
NoneDicts
. Esto ayudaría en caso deKeyError
que ocurriera en el objeto más interno. De lo contrario, el problema es que una vez que devuelve unNone
objeto ya no puede suscribirse. Un truco feo sería devolver otro objeto que pruebeNone
. Sin embargo, tenga en cuenta que esto podría provocar errores horribles.return dict.get(self, key)
areturn super().get(key)
? Entonces, si decido usar OrderedDict en lugar de dict, por ejemplo, no tengo que preocuparme por cambiar varias líneas de código.Usualmente uso un defaultdict para situaciones como esta. Proporciona un método de fábrica que no toma argumentos y crea un valor cuando ve una nueva clave. Es más útil cuando desea devolver algo como una lista vacía en las nuevas claves ( vea los ejemplos ).
fuente
defaultdict
es que seguirá creciendo cada vez que se solicite un elemento no existente.Podrías usar un
dict
elget()
método de objeto , como ya lo han sugerido otros. Alternativamente, dependiendo de exactamente lo que esté haciendo, podría usar unatry/except
suite como esta:Lo cual se considera un enfoque muy "pitónico" para manejar el caso.
fuente
Una solución de una línea sería:
Esto es útil al intentar agregar valores de diccionario a una nueva lista y desea proporcionar un valor predeterminado:
p.ej.
fuente
Como otros han dicho anteriormente, puede usar get ().
Pero para buscar una clave, también puede hacer:
fuente
get
método.Me sorprendió lo que era posible en python2 vs python3. Lo responderé en función de lo que terminé haciendo para python3. Mi objetivo era simple: verificar si una respuesta json en formato de diccionario daba un error o no. Mi diccionario se llama "token" y mi clave que estoy buscando es "error". Estoy buscando "error" clave y si no estaba allí configurándolo en el valor Ninguno, entonces la comprobación es el valor Ninguno, si es así, proceda con mi código. Una instrucción else manejaría si tengo la clave "error".
fuente
Si puede hacerlo
False
, entonces, también está la función integrada hasattr :fuente