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 KeyErrorexcepció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 Nonesi la clave no existe?
python
dictionary
key
nonetype
Spyros
fuente
fuente

.get(key)lugar de[key]Respuestas:
Puedes usar
dict.get()que volverá
Nonesikey is not in d. También puede proporcionar un valor predeterminado diferente que se devolverá en lugar deNone:fuente
Nonesi la clave está asignada explícitamenteNoneen el dict. Si eso no es lo que quieres, puedes usar algo comod.get(key) or "empty".[],"",False,0.0o, de hechoNone), entonces su solución sería volver siempre0. Si esperaNones como valores, tendrá que hacer laif key in d:verificación explícitamente."empty"se devuelve sikeyno es una clave válidad. No tiene nada que ver con el valorkeyasignado.Extrañar más. Está integrado en el lenguaje.
>>> ayuda (dict) Ayuda en clase dict en módulos integrados: clase dict (objeto) El | dict () -> nuevo diccionario vacío El | dict (mapeo) -> nuevo diccionario inicializado de un objeto de mapeo El | (clave, valor) pares ... El | El | obtener(...) El | D.get (k [, d]) -> D [k] si k en D, de lo contrario d. d por defecto es Ninguno. El | ...fuente
Utilizar
dict.getDevuelve 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 ladictclaseEsto resultará en
r == None. Si la clave no se encuentra en el diccionario, la función get devuelve el segundo argumento.fuente
Noneexplícitamente. Es el predeterminado.Si desea una solución más transparente, puede subclasificar
dictpara obtener este comportamiento:fuente
defaultdictes 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 enNonelugar de una excepción, después de una profundidad, comienza a dar enTypeErrorlugar deKeyErrorNoneDicts. Esto ayudaría en caso deKeyErrorque ocurriera en el objeto más interno. De lo contrario, el problema es que una vez que devuelve unNoneobjeto 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
defaultdictes que seguirá creciendo cada vez que se solicite un elemento no existente.Podrías usar un
dictelget()método de objeto , como ya lo han sugerido otros. Alternativamente, dependiendo de exactamente lo que esté haciendo, podría usar unatry/exceptsuite 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
getmé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