Quiero insertar un par clave-valor en dict si la clave no está en dict.keys (). Básicamente podría hacerlo con:
if key not in d.keys():
d[key] = value
Pero hay una manera mejor? ¿O cuál es la solución pitónica a este problema?
python
dictionary
Xiaochen Cui
fuente
fuente
Respuestas:
No necesitas llamar
d.keys()
, entoncesif key not in d: d[key] = value
es suficiente. No existe un método más claro y legible.
Puede actualizar nuevamente con
dict.get()
, lo que devolvería un valor existente si la clave ya está presente:pero recomiendo encarecidamente no hacerlo; esto es golf de código, lo que dificulta el mantenimiento y la legibilidad.
fuente
Utilizar
dict.setdefault()
:>>> d = {1: 'one'} >>> d.setdefault(1, '1') 'one' >>> d # d has not changed because the key already existed {1: 'one'} >>> d.setdefault(2, 'two') 'two' >>> d {1: 'one', 2: 'two'}
fuente
dict.setdefault()
realmente solo debería usarse cuando se intenta acceder al valor también.setdefault()
describe claramente lo que está sucediendo, que también devuelve un valor que no es tan importante y, en mi opinión, un poco peculiar. ¿Podría darnos una explicación rápida, o un enlace a alguna, de por qué esto no es deseable?for obj in iterable: d.setdefault(key_for_obj(obj), []).append(obj)
. No hay nada peculiar en el valor que se devuelve, ese es el objetivo del método .if key not in d:
prueba.setdefault()
parece estar orientado a lo que ha dicho. El uso de undefaultdict(list)
daría como resultado un código más legible que su ejemplo ... así que quizás no sea útil a menos que uno deba trabajar con diccionarios estándar. En general,if key not in d
es más claro.Desde Python 3.9 , puede usar el operador
|
de combinación para combinar dos diccionarios. El dictamen de la derecha tiene prioridad:Nota: esto crea un nuevo diccionario con los valores actualizados.
fuente
Con lo siguiente, puede insertar varios valores y también tener valores predeterminados, pero está creando un nuevo diccionario.
Lo he probado con la respuesta más votada y, en promedio, es más rápido, como se puede ver en el siguiente ejemplo:.
Prueba de velocidad que compara un método basado en bucle for con una comprensión de dictado con un método de operador de desempaquetado.
si no
d = default_vals.copy()
se realiza ninguna copia ( ) en el primer caso, la respuesta más votada sería más rápida una vez que alcancemos órdenes de magnitud de10**5
y mayores. La huella de memoria de ambos métodos es la misma.fuente
{**default_values, **{ key: value }}
De acuerdo con las respuestas anteriores, el método setdefault () funcionó para mí.
old_attr_name = mydict.setdefault(key, attr_name) if attr_name != old_attr_name: raise RuntimeError(f"Key '{key}' duplication: " f"'{old_attr_name}' and '{attr_name}'.")
Aunque esta solución no es genérica. Simplemente me convenía en este caso concreto. La solución exacta sería verificar la
key
primera (como ya se aconsejó), pero consetdefault()
evitamos una búsqueda adicional en el diccionario, es decir, aunque pequeña, pero aún así una ganancia de rendimiento.fuente