Dado un diccionario, ¿cómo puedo saber si una clave dada en ese diccionario ya se ha establecido en un valor distinto de Ninguno?
Es decir, quiero hacer esto:
my_dict = {}
if (my_dict[key] != None):
my_dict[key] = 1
else:
my_dict[key] += 1
Es decir, quiero incrementar el valor si ya hay uno allí, o establecerlo en 1 de lo contrario.
python
dictionary
Ben
fuente
fuente
Respuestas:
Estás buscando
collections.defaultdict
(disponible para Python 2.5+). EstaHará lo que quieras.
Para Python
dict
s normales , si no hay un valor para una clave determinada, no obtendráNone
al acceder al dict: seKeyError
generará a. Entonces, si desea usar undict
código regular , en lugar de su código, usaríafuente
dict
, puedes hacerlomy_dict[key] = my_dict.get(key, 0) + 1
.Prefiero hacer esto en una línea de código.
Los diccionarios tienen una función, get, que toma dos parámetros: la clave que desea y un valor predeterminado si no existe. Prefiero este método por defecto ya que solo desea manejar el caso donde la clave no existe en esta línea de código, no en todas partes.
fuente
Personalmente me gusta usar
setdefault()
fuente
setdefault
es increíble. No altera el valor si ya hay uno configuradosome_key
. Por ejemplo,d={1:2}; d.setdefault(1, 0)
no perturba el valor ded[1]
.Necesitas el
key in dict
idioma para eso.Sin embargo, probablemente debería considerar usar
defaultdict
(como se sugiere dF).fuente
my_dict[key] is not None
, que es más claro (en mi humilde opinión al menos)if key in my_dict and my_dict[key]:
Para responder a la pregunta " ¿cómo puedo saber si un índice dado en ese dict ya se ha establecido en un valor distinto de Ninguno ", preferiría esto:
Esto se ajusta al concepto ya invocado de EAFP (es más fácil pedir perdón que permiso). También evita la búsqueda de claves duplicadas en el diccionario como lo haría en
key in my_dict and my_dict[key] is not None
lo que es interesante si la búsqueda es costosa.Para el problema real que ha planteado, es decir, incrementar un int si existe o establecerlo en un valor predeterminado, de lo contrario, también recomiendo
como en la respuesta de Andrew Wilkinson.
Hay una tercera solución si está almacenando objetos modificables en su diccionario. Un ejemplo común de esto es un mapa múltiple , donde almacena una lista de elementos para sus claves. En ese caso, puede usar:
Si no existe un valor para clave en el diccionario, el método setdefault lo establecerá en el segundo parámetro de setdefault. Se comporta como un my_dict [clave] estándar, devolviendo el valor de la clave (que puede ser el nuevo valor establecido).
fuente
De acuerdo con cgoldberg. Cómo lo hago es:
Por lo tanto, hágalo como se indicó anteriormente o use un dict predeterminado como otros han sugerido. No use declaraciones if. Eso no es pitónico.
fuente
+=2
o-=1
? Tienes que recordar cambiar ambas líneas. Puede parecer una cosa trivial ahora, pero esos son el tipo de pequeños bichos 'triviales' que pueden volver a morderte.Como puede ver en las muchas respuestas, hay varias soluciones. Todavía no se ha mencionado una instancia de LBYL (mira antes de saltar), el método has_key ():
fuente
La forma en que intenta hacerlo se llama LBYL (mire antes de saltar), ya que está verificando las condiciones antes de intentar aumentar su valor.
El otro enfoque se llama EAFP (es más fácil pedir perdón que permiso). En ese caso, simplemente intentaría la operación (incremente el valor). Si falla, detecta la excepción y establece el valor en 1. Esta es una forma un poco más pitónica de hacerlo (IMO).
http://mail.python.org/pipermail/python-list/2003-May/205182.html
fuente
Un poco tarde pero esto debería funcionar.
fuente
Esto no responde directamente a la pregunta, pero para mí, parece que le gustaría la funcionalidad de las colecciones .
Esto da como resultado la salida
fuente
defaultdict(int)
con alguna funcionalidad adicional, por lo que funcionaría perfectamente cuando se trata exclusivamente con enteros, pero no muestra ninguno de los comportamientos relevantes.Aquí hay una frase que se me ocurrió recientemente para resolver este problema. Se basa en el método de diccionario predeterminado :
fuente
Lo estaba buscando, no lo encontré en la web, luego probé suerte con Try / Error y lo encontré
fuente
__contains__
un código de producción. por cierto.__contains__
es lo mismo que usaris
.my_dict.__contains__(some_key)
es equivalente asome_key in my_dict
, es una sobrecarga para elin
operador nois