Diccionarios

¿Puedo tener más de un valor por clave?

No. Una de las propiedades de los diccionarios es que cada clave tenga asociada una variable.

>>> d = {}
>>> d['clave1'] = 'valor1'
>>> d['clave1'] = 'valor2'
>>> d['clave1']
'valor2'
>>>

Una alternativa clásica es utilizar una estructura para los valores, como por ejemplo una lista o incluso otro diccionario. Esto nos permite tener más de "un dato" por clave.

>>> d = {}
>>> d['clave1'] = []
>>> d['clave1'].append('valor1')
>>> d['clave1'].append('valor2')
>>> d['clave1']
['valor1', 'valor2']

¿Qué puedo incluir como tipo de dato dentro de un diccionario?

  • Los valores de los diccionarios pueden ser de cualquier tipo de dato: enteros, cadenas, tuplas, listas, diccionarios, etcétera.
  • Las claves de los diccionarios solo pueden ser tipos de datos inmutables. Si se busca armar un diccionario o conjunto donde las claves son datos mutables como listas, sería necesario realizar una transformación previa (por ejemplo pasar las listas a tuplas).

¿Los diccionarios tienen algún tipo de orden?

Un diccionario no tiene orden.

No obstante, los diccionarios en Python 3.6+ mantienen el orden de inserción. Esto significa que el orden de iteración de las claves será igual al orden que se insertaron los datos. De cualquier forma, en los parcialitos y trabajos prácticos vamos a tratar a los diccionarios como si no tuvieran orden, porque:

  • Esta propiedad del diccionario de Python no aplica de forma universal a todos los lenguajes de programación ni al concepto de diccionario como estructura de datos.
  • El uso de un diccionario que requiera mantener el orden de inserción seguramente no sea la solución más limpia y simple para el problema dado.

¿Qué significa que la búsqueda en un diccionario es de tiempo constante?

El tiempo para obtener el valor de una clave k en un diccionario D será constante, sin importar la cantidad de elementos que haya en D.

Esto es similar a acceder por índice de una lista. El tiempo para obtener el valor de un índice i en una lista L será constante sin importar la cantidad de elementos que tenga L.

Considerando esta propiedad, es importante que se acceda por clave en vez de recorrer todo el diccionario para encontrar una clave o valor particular.

¿Cuándo debería usar un set (conjunto) y cuándo un diccionario?

Ambos tienen la propiedad de búsqueda en tiempo constante y tampoco admiten claves repetidas. La principal diferencia viene en que el set no tiene valores asociadas a las claves.

Un caso muy común para aplicar un set es en aquellas soluciones donde se tiene un diccionario y las claves siempre tienen el mismo valor asociado.

En el apéndice del capítulo 9 del apunte teórico hay un ejemplo concreto del uso de un set, comparando sus alternativas con un diccionario y una lista.

¿Puedo usar un diccionario para representar una matriz?

Pensemos en estas dos estructuras para representar un tablero de 3x2 lleno de valores:

D = {
    (0, 0): 1,
    (0, 1): 2,
    (1, 0): 3,
    (1, 1): 4,
    (2, 0): 5,
    (2, 1): 6,

}

L = [
    [1, 2],
    [3, 4],
    [5, 6]
]

En un principio pareciera que cualquiera de las dos estructuras alcanzan para guardar la información del tablero, pero a nivel código e implementación se podría mencionar:

  • Iterar el diccionario D es más complicado al no tener forma fácil de obtener la dimensiones 3x2, sobre todo si se intenta iterar sobre una columna o fila fija. En cambio con la lista L las dimensiones se obtienen con len(L) y len(L[0]).
  • No hay garantías que el diccionario D no tenga huecos. Una clave particular esperada podría no existir. Tampoco es asegurado que el diccionario D no tenga claves inesperadas como (1, -5) o "como va". La lista L garantiza una coherencia general en cuanto a esto.
  • De la misma mano con el punto anterior, la lista L obliga a tener valores para cada una de las posiciones del tablero, y si queremos representar una matriz enorme es posible encontrarse con problemas de memoria. En cambio con el diccionario D puede asumirse que si una clave no existe, no hay nada en dicha posición.

Como muchos otros temas, depende del problema en particular a resolver pero de cualquier forma debe tenerse en cuenta las ventajas y desventajas de cada solución.