Eliminar un elemento del diccionario si existe la clave [duplicate]

3 minutos de lectura

¿Hay alguna otra forma de eliminar un elemento en un diccionario solo si existe la clave dada, que no sea:

if key in mydict:
    del mydict[key]

El escenario es que me dan una colección de claves para eliminarlas de un diccionario determinado, pero no estoy seguro de si todas ellas existen en el diccionario. En caso de que me pierda una solución más eficiente.

  • @ user1929959 No, esa pregunta quiere una copia del diccionario y no le importa el caso de que la clave no esté en la entrada.

    – phihag

    14/03/2013 a las 13:52

avatar de usuario
Adem Oztas

Puedes usar dict.pop:

 mydict.pop("key", None)

Tenga en cuenta que si el segundo argumento, es decir, None no se da, KeyError se genera si la clave no está en el diccionario. Proporcionar el segundo argumento evita la excepción condicional.

  • Como referencia, el segundo argumento para .pop() es lo que devuelve si no se encuentra la clave.

    – Sendero de Oregón

    23 de julio de 2015 a las 1:05

  • ¿Esto solo hace 1 búsqueda?

    – David Callanan

    19 de noviembre de 2017 a las 18:34

  • hace 2 búsquedas

    – Girish Gupta

    11 de septiembre de 2018 a las 5:56

  • Entonces, solo por curiosidad, ¿cuál es el valor predeterminado del segundo argumento en el código fuente?

    – Carlos Pinzón

    19 de julio de 2021 a las 11:14

  • @CarlosPinzón No hay uno. Ver los documentos. D.pop(key[, default]) “Si key no se encuentra, default se devuelve si se da, de lo contrario KeyError es elevado”.

    – Jonathan Reinhart

    8 dic 2021 a las 5:50

También hay:

try:
    del mydict[key]
except KeyError:
    pass

Esto solo hace 1 búsqueda en lugar de 2. Sin embargo, except Las cláusulas son costosas, por lo que si termina presionando la cláusula de excepción con frecuencia, esto probablemente será menos eficiente que lo que ya tiene.

  • ese es mi miedo No estaba seguro del costo de dos búsquedas por eliminación en comparación con el uso de probar excepto.

    – Simón Hughes

    14/03/2013 a las 13:55

  • @SimonHughes — Ver esta respuesta en programadores…

    – mgilson

    14/03/2013 a las 13:57

  • Esto se llama el es mas facil pedir perdon que permiso (EAFP) Estilo Python.

    – Akki

    22 de julio de 2016 a las 16:55


  • Y EAFP es el enfoque recomendado en Python. Me gustaría ver la evidencia y la justificación de la afirmación “excepto que las cláusulas son caras”.

    -Bobort

    26/10/2016 a las 14:44

  • @Bobort: esto se ha explicado bastante bien en varios lugares. Ver esta respuesta en programadores o esta respuesta en la lista de correo de Python. En resumen, configurar el bloque try/except es económico, pero manejar la excepción es menos económico.

    – mgilson

    26/10/2016 a las 16:25

avatar de usuario
hughdbrown

Enfoque: calcular claves para eliminar, mutar dictado

Llamemos keys la lista/iterador de claves que se le dan para eliminar. Yo haría esto:

keys_to_remove = set(keys).intersection(set(mydict.keys()))
for key in keys_to_remove:
    del mydict[key]

Calcula por adelantado todos los elementos afectados y opera sobre ellos.

Enfoque: calcule las claves para mantener, haga un nuevo dict con esas claves

Prefiero crear un nuevo diccionario en lugar de mutar uno existente, por lo que probablemente también consideraría esto:

keys_to_keep = set(mydict.keys()) - set(keys)
new_dict = {k: v for k, v in mydict.iteritems() if k in keys_to_keep}

o:

keys_to_keep = set(mydict.keys()) - set(keys)
new_dict = {k: mydict[k] for k in keys_to_keep}

  • el primer enfoque no me parece seguro para subprocesos

    – Azat Ibrakov

    19 de agosto de 2019 a las 8:22

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad