Comprobar si existe una clave o un valor en un diccionario en Python

Recuerde los operadores in y not in pueden comprobar si un valor existe en una lista. También puede utilizar estos operadores para ver si una determinada clave o valor existe en un diccionario. Introduzca lo siguiente en el shell interactivo:

>>> spam = {'name': 'Zophie', 'age': 7}
>>> 'name' in spam.keys()
True
>>> 'Zophie' in spam.values()
True
>>> 'color' in spam.keys()
False
>>> 'color' not in spam.keys()
True
>>> 'color' in spam
False

En el ejemplo anterior, observe que 'color' en spam es esencialmente una versión más corta de escribir 'color' in spam.keys(). Este es siempre el caso: si alguna vez quiere comprobar si un valor es (o no es) una clave en el diccionario, puede simplemente utilizar la palabra clave in (o not in) con el propio valor del diccionario.

El método get()

Es tedioso comprobar si una clave existe en un diccionario antes de acceder al valor de esa clave. Afortunadamente, los diccionarios tienen un método get() que toma dos argumentos: la clave del valor a recuperar y un valor de retorno para devolver si esa clave no existe.

Introduzca lo siguiente en el shell interactivo:

>>> picnicItems = {'apples': 5, 'cups': 2}
>>> 'I am bringing ' + str(picnicItems.get('cups', 0)) + ' cups.'
'I am bringing 2 cups.'
>>> 'I am bringing ' + str(picnicItems.get('eggs', 0)) + ' eggs.'
'I am bringing 0 eggs.'

Como no hay una clave 'eggs' en el diccionario de python picnicItems, el método get() devuelve el valor 0 por defecto. Sin usar get(), el código habría provocado un mensaje de error, como en el siguiente ejemplo:

>>> picnicItems = {'apples': 5, 'cups': 2}
>>> 'I am bringing ' + str(picnicItems['eggs']) + ' eggs.'
Traceback (most recent call last):
  File "<pyshell#34>", line 1, in <module>
    'I am bringing ' + str(picnicItems['eggs']) + ' eggs.'
KeyError: 'eggs'

El método setdefault()

A menudo tendrás que establecer un valor en un diccionario para una determinada clave sólo si esa clave no tiene ya un valor. El código se parece a esto:

spam = {'name': 'Pooka', 'age': 5}
if 'color' not in spam:
    spam['color'] = 'black'

El método setdefault() ofrece una manera de hacer esto en una línea de código. El primer argumento que se pasa al método es la clave que hay que comprobar, y el segundo argumento es el valor que hay que establecer en esa clave si ésta no existe. Si la clave existe, el método setdefault() devuelve el valor de la clave. Introduzca lo siguiente en el shell interactivo:

>>> spam = {'name': 'Pooka', 'age': 5}
>>> spam.setdefault('color', 'black')
'black'
>>> spam
{'color': 'black', 'age': 5, 'name': 'Pooka'}
>>> spam.setdefault('color', 'white')
'black'
>>> spam
{'color': 'black', 'age': 5, 'name': 'Pooka'}

La primera vez que se llama a setdefault(), el diccionario de spam cambia a {'color': 'black', 'age': 5, 'name': 'Pooka'}. El método devuelve el valor 'black' porque éste es ahora el valor establecido para la clave 'color'. Cuando se llame después a spam.setdefault('color', 'white'), el valor de esa clave no se cambiará a 'white', porque el spam ya tiene una clave llamada 'color'.

El método setdefault() es un buen atajo para asegurar que una clave existe. Aquí hay un corto programa que cuenta el número de ocurrencias de cada letra en una cadena. Abre la ventana del editor de archivos e introduce el siguiente código, guardándolo como characterCount.py:

message = 'It was a bright cold day in April, and the clocks were striking
thirteen.'
count = {}

for character in message:
➊ count.setdefault(character, 0)
➋ count[character] = count[character] + 1

print(count)    

Puedes ver la ejecución de este programa en https://autbor.com/setdefault. El programa hace un bucle sobre cada carácter de la cadena de la variable mensaje, contando la frecuencia con la que aparece cada carácter. La llamada al método setdefault() ➊ asegura que la clave está en el diccionario count (con un valor por defecto de 0) para que el programa no lance un error KeyError cuando se ejecute count[character] = count[character] + 1 ➋. Cuando se ejecuta este programa, la salida se verá así:

{' ': 13, ',': 1, '.': 1, 'A': 1, 'I': 1, 'a': 4, 'c': 3, 'b': 1, 'e': 5, 'd': 3, 'g': 2,
'i': 6, 'h': 3, 'k': 2, 'l': 3, 'o': 2, 'n': 4, 'p': 1, 's': 3, 'r': 5, 't': 6, 'w': 2, 'y': 1}

En la salida, puedes ver que la letra c minúscula aparece 3 veces, el carácter espacio aparece 13 veces y la letra A mayúscula aparece 1 vez. Este programa funcionará independientemente de la cadena que haya dentro de la variable de message, ¡incluso si la cadena tiene millones de caracteres!

Deja una respuesta