Explicación de la estructura de datos del diccionario de Python

El diccionario es una de las estructuras de datos más utilizadas en Python. Un diccionario es una colección desordenada de elementos y normalmente tenemos claves y valores almacenados en un diccionario. Veamos algunos ejemplos de cómo se usa habitualmente el diccionario.

# dictionary declaration 1 dict1 = dict() # dictionary declaration 2 dict2 = {} # Add items to the dictionary # The syntax to add and retrieve items is same for either of the two objects we defined above. key = "X" value = "Y" dict1[key] = value # The dictionary doesn't have any specific data-type. # So, the values can be pretty diverse. dict1[key] = dict2

Veamos ahora algunas formas de recuperación.

# Since "X" exists in our dictionary, this will retrieve the value value = dict1[key] # This key doesn't exist in the dictionary. # So, we will get a `KeyError` value = dict1["random"]

Evitar KeyError: use la función .get

En caso de que la clave dada no exista en el diccionario, Python arrojará un KeyError. Hay una solución sencilla para esto. Veamos cómo podemos evitar el KeyErroruso de la .getfunción incorporada para los diccionarios.

dict_ = {} # Some random key random_key = "random" # The most basic way of doing this is to check if the key # exists in the dictionary or not and only retrieve if the # key exists. Otherwise not. if random_key in dict_: print(dict_[random_key]) else: print("Key = {} doesn't exist in the dictionary".format(dict_))

Muchas veces podemos obtener un valor predeterminado cuando la clave no existe. Por ejemplo, al construir un mostrador. Existe una mejor manera de obtener valores predeterminados del diccionario en caso de que falten claves en lugar de confiar en el estándar if-else.

# Let's say we want to build a frequency counter for items in the following array arr = [1,2,3,1,2,3,4,1,2,1,4,1,2,3,1] freq = {} for item in arr: # Fetch a value of 0 in case the key doesn't exist. Otherwise, fetch the stored value freq[item] = freq.get(item, 0) + 1

Por lo tanto, get(, )es una operación útil para recuperar el valor predeterminado para cualquier clave dada del diccionario. El problema con este método surge cuando queremos tratar con estructuras de datos mutables como valores, por ejemplo listo set.

dict_ = {} # Some random key random_key = "random" dict_[random_key] = dict_.get(random_key, []).append("Hello World!") print(dict_) # {'random': None} dict_ = {} dict_[random_key] = dict_.get(random_key, set()).add("Hello World!") print(dict_) # {'random': None}

¿Viste el problema?

El nuevo seto listno se asigna a la clave del diccionario. Debemos asignar una nueva listo una seta la clave en caso de que falte un valor y luego appendo addrespectivamente. Ley mira un ejemplo para esto.

dict_ = {} dict_[random_key] = dict_.get(random_key, set()) dict_[random_key].add("Hello World!") print(dict_) # {'random': set(['Hello World!'])}. Yay!

Evitar KeyError: use defaultdict

Esto funciona la mayoría de las veces. Sin embargo, existe una forma mejor de hacerlo. Una pythonicforma más . El defaultdictes una subclase de la clase dict incorporado. El defaultdictsimplemente asigna el valor predeterminado que se especifica en el caso de una clave que falta. Entonces, los dos pasos:

dict_[random_key] = dict_.get(random_key, set()) dict_[random_key].add("Hello World!")

ahora se puede combinar en un solo paso. Por ejemplo

from collections import defaultdict # Yet another random key random_key = "random_key" # list defaultdict list_dict_ = defaultdict(list) # set defaultdict set_dict_ = defaultdict(set) # integer defaultdict int_dict_ = defaultdict(int) list_dict_[random_key].append("Hello World!") set_dict_[random_key].add("Hello World!") int_dict_[random_key] += 1 """ defaultdict(, {'random_key': ['Hello World!']}) defaultdict(, {'random_key': {'Hello World!'}}) defaultdict(, {'random_key': 1}) """ print(list_dict_, set_dict_, int_dict_)

Documentos oficiales