Tema 8: Diccionarios

Compartir en:
Haz clic aquí para ver la videoclase

Contenidos

Referencia principal: Capítulo 9 de Severance, C. R. (2016). Python for everybody: Exploring data using Python 3. Ann Arbor, MI: Charles Severance.

Diccionarios

Los diccionarios son un tipo de lista, pero con mayor libertad. Hemos visto que los índices o claves de las listas eran números enteros y, por este motivo, para acceder a los elementos de una lista, poníamos el entero correspondiente al índice del elemento entre corchetes:

1frutas = ['banana', 'pera', 'manzana']
2
3# accedemos al primer elemento mediante su indice o clave
4
5print(frutas[0])
banana


Los diccionarios son objetos cuyas claves pueden ser de cualquier tipo, no solo enteros. Esto permite crear pares de clave y valor, como los diccionarios lingüísticos, donde la clave sería el lema y el valor la definición. El delimitador de los diccionarios son las llaves ({, }). Como las listas, los diccionarios se pueden declarar con todos sus elementos; sin embargo, es frecuente comenzar con un diccionario vacío e ir añadiendo los pares sucesivamente.


Veamos un ejemplo de diccionario que almacena palabras en español como claves y su traducción en inglés como valor.

1esp_ing = {} # creamos un objeto diccionario vacío
2
3esp_ing['manzana'] = 'apple' # añadimos una clave manzana con el valor apple
4
5print(esp_ing)
6
7esp_ing['pera'] = 'pear' # añadimos una clave pera con el valor manzana
8
9print(esp_ing)
{'manzana': 'apple'}
{'manzana': 'apple', 'pera': 'pear'}


Esto mismo lo prodríamos haber declarado desde el principio:

1esp_ing  = {'manzana': 'apple', 'pera': 'pear'}
2
3print(esp_ing)
{'manzana': 'apple'}


Como hemos comentado al principio, las claves de los diccionarios funcionan como índices. Por ello, para acceder a valores internos de un diccionario utilizamos las claves:

1esp_ing  = {'manzana': 'apple', 'pera': 'pear'}
2
3print(esp_ing['manzana'])
apple


Como los diccionarios son secuencias y tienen índices, también tienen longitud:

1esp_ing  = {'manzana': 'apple', 'pera': 'pear'}
2
3print(len(esp_ing))
2


Con el operador in podemos comprobar si existe una clave en un diccionario. Podríamos pensar en un pequeño script que nos tradujera palabras si las tenemos en nuestro diccionario:

 1esp_ing  = {
 2
 3    'manzana': 'apple',
 4
 5    'pera': 'pear',
 6
 7    'aguacate': 'avocado',
 8
 9    'cereza': 'cherry'
10
11    }
12
13
14
15palabra = input('¿Qué palabra quieres traducir? ')
16
17if palabra in esp_ing:
18
19  print(palabra, 'se dice', esp_ing[palabra], 'en inglés.')
20
21else:
22
23  print('No conozco esa palabra')
¿Qué palabra quieres traducir? manzana
manzana se dice apple en inglés.


Recorriendo diccionarios

A menudo no conocemos un diccionario y tenemos que recorrerlo en busca de lo que necesitamos. Hay varios métodos para iterar diccionarios. La más sencilla es hacer un bucle sobre el propio diccionario y en cada iteración acceder a los valores con el índice:

 1esp_ing  = {
 2
 3    'manzana': 'apple',
 4
 5    'pera': 'pear',
 6
 7    'aguacate': 'avocado',
 8
 9    'cereza': 'cherry'
10
11    }
12
13
14
15for key in esp_ing:
16
17  print(key, 'se dice', esp_ing[key], 'en inglés')
manzana se dice apple en inglés
pera se dice pear en inglés
aguacate se dice avocado en inglés
cereza se dice cherry en inglés


Cuando damos un diccionario íntegro a for, la iteración se hace sobre las claves. Observa cómo la variable key toma en cada iteración el valor de la clave y, por ello, podemos acceder a cada valor con la expresión esp_ing[key]. Es como si fuésemos diciendo:

  • esp_ing['manzana']

  • esp_ing['pera']

  • esp_ing['aguacate']

  • esp_ing['cereza']

Pero, como en cada vuelta el iterador key se convierte en la clave correspondiente, con una línea resolvemos el problema.


Otra manera de recorrer un diccionario es mediante las parejas de clave-valor o items. Los diccionarios de Python incluyen un método items() que devuelve una lista de tuplas con las claves y los valores. Veamos el resultado de este método sobre nuestro diccionario de frutas.

 1esp_ing  = {
 2
 3    'manzana': 'apple',
 4
 5    'pera': 'pear',
 6
 7    'aguacate': 'avocado',
 8
 9    'cereza': 'cherry'
10
11    }
12
13print(esp_ing.items())
dict_items([('manzana', 'apple'), ('pera', 'pear'), ('aguacate', 'avocado'), ('cereza', 'cherry')])


El método items() nos permite hacer un bucle con tuplas y acceder directamente al par:

 1esp_ing  = {
 2
 3    'manzana': 'apple',
 4
 5    'pera': 'pear',
 6
 7    'aguacate': 'avocado',
 8
 9    'cereza': 'cherry'
10
11    }
12
13
14
15for esp, ing in esp_ing.items():
16
17  print(esp, 'se dice', ing, 'en inglés')
manzana se dice apple en inglés
pera se dice pear en inglés
aguacate se dice avocado en inglés
cereza se dice cherry en inglés


En ocasiones, lo que necesitamos obtener son solo las claves o solo los valores de un diccionario. Para ello tenemos los métodos keys() y values(), que nos devuelven una lista con las claves y los valores respectivamente.

 1esp_ing  = {
 2
 3    'manzana': 'apple',
 4
 5    'pera': 'pear',
 6
 7    'aguacate': 'avocado',
 8
 9    'cereza': 'cherry'
10
11    }
12
13
14
15print(esp_ing.keys())
16
17print(esp_ing.values())
dict_keys(['manzana', 'pera', 'aguacate', 'cereza'])
dict_values(['apple', 'pear', 'avocado', 'cherry'])


¿Recuerdas el método join()? Si no lo recuerdas, puedes recordarlo en el tema dedicado a las listas. Vamos a utilizarlo para saber cuántas cosas sabe decir nuestro diccionario:

 1esp_ing  = {
 2
 3    'manzana': 'apple',
 4
 5    'pera': 'pear',
 6
 7    'aguacate': 'avocado',
 8
 9    'cereza': 'cherry'
10
11    }
12
13esp = ", ".join(esp_ing.keys())
14
15print('En español sé decir', esp)
16
17ing = ", ".join(esp_ing.values())
18
19print('En inglés sé decir', ing)
En español sé decir manzana, pera, aguacate, cereza
En inglés sé decir apple, pear, avocado, cherry


Práctica

 1# Diccionario de apariciones 
 2
 3texto = '''
 4
 5Habían descansado. Siguieron adelante, hasta llegar a la entrada del bosque que hay más allá de Saldeoro. Detuviéronse entre un grupo de viejos nogales, cuyos troncos y raíces formaban en el suelo una serie de escalones, con musgosos huecos y recortes tan apropiados para sentarse, que el arte no los hiciera mejor. Desde lo alto del bosque corría un hilo de agua, saltando de piedra en piedra, hasta dar con su fatigado cuerpo en un estanquillo que servía de depósito para alimentar el chorro de que se abastecían los vecinos. Enfrente el suelo se deprimía poco a poco, ofreciendo grandioso panorama de verdes colinas pobladas de bosques y caseríos, de praderas llanas donde pastaban con tranquilidad vagabunda centenares de reses. En el último término dos lejanos y orgullosos cerros que   —84→   eran límite de la tierra, dejaban ver en un largo segmento azul purísimo del mar. Era un paisaje cuya contemplación revelaba al alma sus excelsas relaciones con lo infinito.
 6
 7
 8
 9Sentose Pablo en el tronco de un nogal, apoyando su brazo izquierdo en el borde del estanque. Alzaba la derecha mano para coger las ramas que descendían hasta tocar su frente, por la cual pasaba a ratos, con el mover de las hojas, un rayo de sol.
10
11'''
12
13log = {}
14
15for palabra in texto.split():
16
17  if palabra not in log:
18
19    log[palabra] = 1
20
21  else:
22
23    log[palabra] = log[palabra] + 1
24
25print(log)
{'Habían': 1, 'descansado.': 1, 'Siguieron': 1, 'adelante,': 1, 'hasta': 3, 'llegar': 1, 'a': 3, 'la': 4, 'entrada': 1, 'del': 4, 'bosque': 2, 'que': 6, 'hay': 1, 'más': 1, 'allá': 1, 'de': 15, 'Saldeoro.': 1, 'Detuviéronse': 1, 'entre': 1, 'un': 7, 'grupo': 1, 'viejos': 1, 'nogales,': 1, 'cuyos': 1, 'troncos': 1, 'y': 4, 'raíces': 1, 'formaban': 1, 'en': 6, 'el': 8, 'suelo': 2, 'una': 1, 'serie': 1, 'escalones,': 1, 'con': 5, 'musgosos': 1, 'huecos': 1, 'recortes': 1, 'tan': 1, 'apropiados': 1, 'para': 3, 'sentarse,': 1, 'arte': 1, 'no': 1, 'los': 2, 'hiciera': 1, 'mejor.': 1, 'Desde': 1, 'lo': 2, 'alto': 1, 'corría': 1, 'hilo': 1, 'agua,': 1, 'saltando': 1, 'piedra': 1, 'piedra,': 1, 'dar': 1, 'su': 3, 'fatigado': 1, 'cuerpo': 1, 'estanquillo': 1, 'servía': 1, 'depósito': 1, 'alimentar': 1, 'chorro': 1, 'se': 2, 'abastecían': 1, 'vecinos.': 1, 'Enfrente': 1, 'deprimía': 1, 'poco': 1, 'poco,': 1, 'ofreciendo': 1, 'grandioso': 1, 'panorama': 1, 'verdes': 1, 'colinas': 1, 'pobladas': 1, 'bosques': 1, 'caseríos,': 1, 'praderas': 1, 'llanas': 1, 'donde': 1, 'pastaban': 1, 'tranquilidad': 1, 'vagabunda': 1, 'centenares': 1, 'reses.': 1, 'En': 1, 'último': 1, 'término': 1, 'dos': 1, 'lejanos': 1, 'orgullosos': 1, 'cerros': 1, '—84→': 1, 'eran': 1, 'límite': 1, 'tierra,': 1, 'dejaban': 1, 'ver': 1, 'largo': 1, 'segmento': 1, 'azul': 1, 'purísimo': 1, 'mar.': 1, 'Era': 1, 'paisaje': 1, 'cuya': 1, 'contemplación': 1, 'revelaba': 1, 'al': 1, 'alma': 1, 'sus': 1, 'excelsas': 1, 'relaciones': 1, 'infinito.': 1, 'Sentose': 1, 'Pablo': 1, 'tronco': 1, 'nogal,': 1, 'apoyando': 1, 'brazo': 1, 'izquierdo': 1, 'borde': 1, 'estanque.': 1, 'Alzaba': 1, 'derecha': 1, 'mano': 1, 'coger': 1, 'las': 2, 'ramas': 1, 'descendían': 1, 'tocar': 1, 'frente,': 1, 'por': 1, 'cual': 1, 'pasaba': 1, 'ratos,': 1, 'mover': 1, 'hojas,': 1, 'rayo': 1, 'sol.': 1}


 1# Buscar una clase cerrada de palabras
 2
 3texto = '''
 4
 5Habían descansado. Siguieron adelante, hasta llegar a la entrada del bosque que hay más allá de Saldeoro. Detuviéronse entre un grupo de viejos nogales, cuyos troncos y raíces formaban en el suelo una serie de escalones, con musgosos huecos y recortes tan apropiados para sentarse, que el arte no los hiciera mejor. Desde lo alto del bosque corría un hilo de agua, saltando de piedra en piedra, hasta dar con su fatigado cuerpo en un estanquillo que servía de depósito para alimentar el chorro de que se abastecían los vecinos. Enfrente el suelo se deprimía poco a poco, ofreciendo grandioso panorama de verdes colinas pobladas de bosques y caseríos, de praderas llanas donde pastaban con tranquilidad vagabunda centenares de reses. En el último término dos lejanos y orgullosos cerros que   —84→   eran límite de la tierra, dejaban ver en un largo segmento azul purísimo del mar. Era un paisaje cuya contemplación revelaba al alma sus excelsas relaciones con lo infinito.
 6
 7
 8
 9Sentose Pablo en el tronco de un nogal, apoyando su brazo izquierdo en el borde del estanque. Alzaba la derecha mano para coger las ramas que descendían hasta tocar su frente, por la cual pasaba a ratos, con el mover de las hojas, un rayo de sol.
10
11'''
12
13artic = ['el', 'la', 'los', 'las', 'al', 'del']
14
15
16
17log = {}
18
19for palabra in texto.split():
20
21  if palabra in artic:
22
23    if palabra not in log:
24
25      log[palabra] = 1
26
27    else:
28
29      log[palabra] = log[palabra] + 1
30
31print('Hay un total de', sum(log.values()), 'artículos')
32
33print(log)
Hay un total de 21 artículos
{'la': 4, 'del': 4, 'el': 8, 'los': 2, 'al': 1, 'las': 2}