1.7. Todo sobre los diccionarios

A continuación una breve digresión para conocer los diccionarios, las tuplas y las listas (¡oh, no!). Si es usted un hacker de Perl, probablemente pueda saltarse la parte sobre diccionarios y listas, pero debería prestar atención a las tuplas.

Uno de los tipos de datos incorporados en Python es el diccionario, que define una relación uno a uno entre claves y valores.

Nota
Un diccionario en Python es como un hash en Perl. En Perl, las variables que almacenan hashes comienzan siempre por el carácter %; en Python, las variables pueden tener cualquier nombre, y Python guarda internamente el tipo de dato.
Nota
Un diccionario en Python es como una instancia de la clase Hashtable en Java.
Nota
Un diccionario en Python es como una instancia del objeto Scripting.Dictionary en Visual Basic.

Ejemplo 1.9. Definición de un diccionario

>>> d = {"server":"mpilgrim", "database":"master"} 1
>>> d
{'server': 'mpilgrim', 'database': 'master'}
>>> d["server"]                                    2
'mpilgrim'
>>> d["database"]                                  3
'master'
>>> d["mpilgrim"]                                  4
Traceback (innermost last):
  File "<interactive input>", line 1, in ?
KeyError: mpilgrim
1 En primer lugar, creamos un diccionario nuevo con dos elementos y lo asignamos a la variable d. Cada elemento es un par clave-valor, y el conjunto total de elementos se encierra entre llaves.
2 server es una clave, y su valor asociado, al que se hace referencia con d["server"], es mpilgrim.
3 database es una clave, y su valor asociado, al que se hace referencia con d["database"], es master.
4 Se pueden obtener los valores por su clave, pero no se pueden obtener las claves por el valor. Así, d["server"] es mpilgrim, pero d["mpilgrim"] lanza una excepción, porque mpilgrim no es una clave.

Ejemplo 1.10. Modificación de un diccionario

>>> d
{'server': 'mpilgrim', 'database': 'master'}
>>> d["database"] = "pubs" 1
>>> d
{'server': 'mpilgrim', 'database': 'pubs'}
>>> d["uid"] = "sa"        2
>>> d
{'server': 'mpilgrim', 'uid': 'sa', 'database': 'pubs'}
1 No puede haber claves duplicadas en un diccionario. La asignación de un valor a una clave existente borrará el valor anterior.
2 Se pueden añadir nuevos pares clave-valor en cualquier momento. Esta sintaxis es idéntica a la de la modificación de valores existentes. (Sí, esto le molestará algún día, cuando pensando que está añadiendo nuevos valores esté realmente modificando el mismo valor una y otra vez porque la clave no cambia de la manera que usted piensa.)

Advierta que el nuevo elemento (clave uid, valor sa) aparece en medio. De hecho, es sólo una coincidencia que los elementos aparecieran en orden en el primer ejemplo; es también una coincidencia que aparezcan desordenados ahora.

Nota
Los diccionarios no tienen concepto alguno de orden entre sus elementos. Es incorrecto decir que los elementos están “desordenados”; simplemente no hay orden. Esta distinción es importante, y le estorbará cuando intente acceder a los elementos de un diccionario en un orden específico y repetible (como el orden alfabético de las claves). Hay formas de hacer esto, sólo que no forman parte de los diccionarios.

Ejemplo 1.11. Mezcla de tipos de datos en un diccionario

>>> d
{'server': 'mpilgrim', 'uid': 'sa', 'database': 'pubs'}
>>> d["retrycount"] = 3 1
>>> d
{'server': 'mpilgrim', 'uid': 'sa', 'database': 'master', 'retrycount': 3}
>>> d[42] = "douglas"   2
>>> d
{'server': 'mpilgrim', 'uid': 'sa', 'database': 'master', 42: 'douglas', 'retrycount': 3}
1 Los diccionarios no sirven solamente para almacenar cadenas. Los valores de un diccionario pueden ser de cualquier tipo, incluidas cadenas, enteros, objetos o incluso otros diccionarios. Y en un mismo diccionario, los valores no tienen que ser todos del mismo tipo: se pueden mezclar y emparejar como sea necesario.
2 Las claves de un diccionario están más restringidas, pero pueden ser cadenas, enteros, y algunos tipos más (lo veremos más adelante). También se pueden mezclar y emparejar distintos tipos de claves en un diccionario.

Ejemplo 1.12. Eliminación de elementos de un diccionario

>>> d
{'server': 'mpilgrim', 'uid': 'sa', 'database': 'master', 42: 'douglas', 'retrycount': 3}
>>> del d[42] 1
>>> d
{'server': 'mpilgrim', 'uid': 'sa', 'database': 'master', 'retrycount': 3}
>>> d.clear() 2
>>> d
{}
1 del permite borrar elementos individuales de un diccionario por su clave.
2 clear borra todos los elementos de un diccionario. Advierta que el conjunto de las dos llaves vacías indica un diccionario sin elementos.

Ejemplo 1.13. Las cadenas diferencian mayúsculas y minúsculas

>>> d = {}
>>> d["key"] = "value"
>>> d["key"] = "other value" 1
>>> d
{'key': 'other value'}
>>> d["Key"] = "third value" 2
>>> d
{'Key': 'third value', 'key': 'other value'}
1 Al asignar un valor a una clave existente en un diccionario, simplemente se sustituye el valor antiguo con el nuevo.
2 Aquí no se asigna un valor a una clave existente en el diccionario, porque en las cadenas de Python se diferencia entre mayúsculas y minúsculas, de modo que 'key' no es lo mismo que 'Key'. Aquí se crea un nuevo par clave-valor en el diccionario; puede parecer lo mismo, pero tal como lo ve Python, es completamente distinto.

Lecturas complementarias