Python: compruebe si la clave existe en el diccionario

     

    Introducción

    El diccionario (también conocido como ‘mapa’, ‘hash’ o ‘matriz asociativa’) es un contenedor Python integrado que almacena elementos como un par clave-valor.

    Al igual que otros contenedores tienen indexación numérica, aquí usamos claves como índices. Las claves pueden ser valores numéricos o de cadena. Sin embargo, ninguna secuencia u objeto mutable se puede utilizar como clave, como una lista.

    En este artículo, veremos cómo verificar si existe una clave en un diccionario en Python.

    En los ejemplos, usaremos esto fruits_dict diccionario:

    fruits_dict = dict(apple= 1, mango= 3, banana= 4)
    
    {'apple': 1, 'banana': 4, 'mango': 3}
    

    Compruebe si la clave existe usando en el operador

    La forma más sencilla de comprobar si existe una clave en un diccionario es utilizar la in operador. Es un operador especial que se utiliza para evaluar la pertenencia de un valor.

    Aquí evaluará a True si la clave existe o para False si no es así:

    key = 'orange'
    
    if key in fruits_dict:
        print('Key Found')
    else:
        print('Key not found')
    

    Ahora, dado que no tenemos un orange en nuestro diccionario, este es el resultado:

    Key not found
    

    Este es el enfoque deseado y preferido por la mayoría de los desarrolladores. Debajo del capó, utiliza el __contains__() función para comprobar si una tecla determinada es in un diccionario o no.

    Compruebe si la clave existe usando get ()

    los get() la función acepta un key, y un valor opcional que se devolverá si el key no se encuentra. De forma predeterminada, este valor opcional es None. Podemos intentar obtener una clave, y si el valor devuelto es None, eso significa que no está presente en el diccionario:

    key = 'orange'
    
    if fruits_dict.get(key) == None:
        print('Key not found')
    else:
        print('Key found') 
    

    Esto resulta en:

    Key not found
    

    Compruebe si la clave existe usando las teclas ()

    los keys() La función devuelve las claves de nuestro diccionario como una secuencia:

    fruits_dict.keys()
    

    Esta secuencia contiene:

    dict_keys(['apple', 'mango', 'banana'])
    

    Usando esta secuencia, podemos verificar si la clave está presente. Puede hacer esto a través de un bucle, o mejor aún, use el in operador:

    key = 'orange'
    
    if key in fruits_dict.keys():
        print('Key found')
    else:
        print('Key not found')
    

    Esto también resulta en:

    Key not found
    

    Verifique si la clave existe usando has_key ()

    En lugar de obtener manualmente las claves y ejecutar una verificación si el valor que estamos buscando está presente, podemos usar el método abreviado has_key() función:

    key = 'orange'
    
    if fruits_dict.has_key(key):
        print('Key found')
    else:
        print('Key not found')
    

    Vuelve True o False, basado en la presencia de la clave. Este código genera:

    Key not found
    

    Manejo de la excepción ‘KeyError’

    Una forma interesante de evitar problemas con una clave inexistente o, en otras palabras, de comprobar si existe una clave en nuestro diccionario o no, es utilizar la try y except cláusula para manejar el KeyError excepción.

    La siguiente excepción se genera cada vez que nuestro programa no localiza la clave respectiva en el diccionario.

    Es una forma simple, elegante y rápida de manejar la búsqueda de claves:

    try:
        fruits_dict[key]
    except KeyError as err:
        print('Key not found')
    

    Este enfoque, aunque puede parecer poco intuitivo, en realidad es significativamente más rápido que algunos otros enfoques que hemos cubierto hasta ahora.

    Nota: Tenga en cuenta que las excepciones no deben usarse para alterar el flujo de código o para implementar la lógica. Disparan muy rápido, pero recuperarse de ellos es muy lento. Este enfoque no debe favorecerse sobre otros enfoques, cuando sea posible.

    Comparemos su rendimiento para tener una mejor idea de qué tan rápido se pueden ejecutar.

    Comparación de rendimiento

    import timeit
    
    code_setup = """
    key = 'orange'
    fruits_dict = dict(apple= 1, mango= 3, banana= 4)
    """
    
    code_1 = """
    if key in fruits_dict:
      # print('Key Found')
      pass
    else:
      # print('Key not found')
      pass 
    """
    
    code_2 = """
    if fruits_dict.get(key):
      # print('Key found')
      pass
    else:
      # print('Key not found')
      pass 
    """
    
    code_3 = """
    if fruits_dict.__contains__(key):
      # print('Key found')
      pass
    else:
      # print('Key not found')
      pass  
    """
    
    code_4 = """
    try:
      # fruits_dict[key]
      pass
    except KeyError as err:
      # print('Key not found')
      pass 
    """
      
    code_5 = """
    if key in fruits_dict.keys():
      # print('Key found')
      pass
    else:
      # print('Key not found')
      pass 
    """
    
    print('Time of code_1: ', timeit.timeit(setup = code_setup , stmt= code_1, number= 10000000))
    print('Time of code_2: ', timeit.timeit(setup = code_setup , stmt= code_2, number= 10000000))
    print('Time of code_3: ', timeit.timeit(setup = code_setup , stmt= code_3, number= 10000000))
    print('Time of code_4: ', timeit.timeit(setup = code_setup , stmt= code_4, number= 10000000))
    print('Time of code_5: ', timeit.timeit(setup = code_setup , stmt= code_5, number= 10000000))
    

    Esto produce:

    Time of code_1:  0.2753713619995324
    Time of code_2:  0.8163219139996727
    Time of code_3:  0.5563563220002834
    Time of code_4:  0.1561058730003424
    Time of code_5:  0.7869278369998938
    

    La elección y el enfoque más populares, de utilizar el in El operador es bastante rápido y también es el enfoque previsto para resolver este problema.

    Conclusión

    En este artículo, discutimos varias formas de verificar si existe una clave en nuestro diccionario o no. Luego hicimos una comparación de desempeño.

     

    Etiquetas:

    Deja una respuesta

    Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *