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 *