Guía de diccionarios de Python: cómo iterar, copiar y combinar diccionarios en Python 3.9

Python es un lenguaje popular para la ciencia de datos. Y trabajar con colecciones es una de las habilidades más fundamentales que debe tener.

Las colecciones son estructuras de datos que contienen múltiples elementos de varios tipos de datos diferentes.

Hoy vamos a echar un vistazo detallado a los diccionarios, que son un tipo especial de colección en Python. Cubriremos su funcionalidad básica, su funcionamiento interno y también algunas características de vanguardia de la última versión de Python.

Al final de este tutorial, sabrá

  • Que son los diccionarios
  • Cómo trabajar con diccionarios
  • Cómo iterar sobre diccionarios
  • Cómo copiar diccionarios
  • Cómo combinar diccionarios en Python 3.9

¿Qué son los diccionarios en Python?

Antes de conocer algo en profundidad, siempre es bueno comenzar con una definición simple y básica.

Como ya dije, los diccionarios son un tipo de colección en Python. Sin embargo, a diferencia de las listas, tuplas y conjuntos, no almacena valores individuales sino los denominados pares clave-valor . Esto significa que en lugar de hacer referencia a sus valores a través de un índice, utiliza una clave, que es un identificador único.

l1 = [10, "Hello", True, 20.23] # List t1 = (10, "Hello", True, 20.23) # Tuple s1 = {10, "Hello", True, 20.23} # Set d1 = {'number': 10, 'greeting': "Hello", 'boolean': True, 'float': 20.23} # Dictionary 

En el ejemplo anterior, puede ver la diferencia. Los pares clave-valor individuales están separados por comas. Cada par comienza con una clave única seguida de dos puntos y el valor respectivo. Tenga en cuenta que el valor no tiene que ser único, ya que no lo usamos para acceder o identificar nada.

También tenga en cuenta que podemos usar cualquier tipo de datos para las claves y valores que queramos. Aquí solo usamos cadenas para los identificadores pero también podemos usar enteros, flotantes, colecciones o incluso booleanos.

Sin embargo, siempre debe preguntarse qué tan razonable es esto. La mayoría de las veces, una cuerda será la mejor opción.

Cómo trabajar con diccionarios en Python

Muy bien, ahora que sabemos qué son los diccionarios, echemos un vistazo a cómo trabajar con ellos.

Primero, repasaremos las operaciones básicas como acceder, agregar y eliminar valores. Después de eso, veremos algunos temas más avanzados e interesantes.

Puede acceder a elementos de un diccionario en Python de la misma forma que accede a elementos de cualquier otra colección. La única diferencia es que pasa una clave en lugar de un índice. Esto también se aplica para cambiar e incluso agregar valores.

person = {'name': "Mike", 'age': 25, 'weight': 80.5} print(person['name']) person['name'] = "Bob" # Changing existing value print(person['name']) person['gender'] = 'm' # Creating new key-value pair print(person['gender']) 

Como puede ver aquí, simplemente pasa una clave para acceder al valor al que se refiere. Primero imprime el nombre, luego lo cambia. Luego, lo imprime nuevamente para asegurarse de que se realizaron los cambios.

Tenga en cuenta que esto no solo funciona para los pares ya existentes sino también para los nuevos. Para crear un nuevo par clave-valor, simplemente consulte una clave que aún no existe y asígnele un valor. Luego, el par se agrega al diccionario automáticamente.

La eliminación de valores de un diccionario funciona de manera diferente. Aquí se puede utilizar el delpalabra clave o el método pop () .

La principal diferencia entre esos dos enfoques es que del solo elimina el par clave-valor, mientras que pop () también devuelve el valor eliminado después. Dependiendo de su caso de uso, tendrá que decidir qué método se adapta mejor a su tarea.

Cómo iterar sobre diccionarios en Python

Dado que los diccionarios son colecciones, también puede iterar sobre ellos. Pero esto no es tan simple y sencillo como lo es con los otros tipos de colecciones.

Esto se debe a que no se trata de valores individuales sino de pares. Cuando itera sobre un diccionario, usando un bucle for, en realidad solo está iterando sobre las claves.

names_ages = {'Bob': 50, 'Anna': 28, 'Max': 30, 'John': 76} for element in names_ages: print(element) # Output: Bob Anna Max John 

Por lo tanto, si desea iterar sobre los valores o incluso los pares completos, debe usar métodos adicionales.

Para acceder a los valores, solo tiene que llamar a los valores ()método. Devuelve un iterador para todos los valores del diccionario.

Para acceder a los pares completos, puede llamar a los elementos ()método. Aquí se itera sobre una lista de tuplas, donde cada tupla representa un par clave-valor.

Por supuesto, también existe el método keys () , en caso de que desee trabajar con las claves del diccionario fuera de un bucle for.

print(list(names_ages.keys())) print(list(names_ages.values())) print(list(names_ages.items())) # Output # > ['Bob', 'Anna', 'Max', 'John'] # > [50, 28, 30, 76] # > [('Bob', 50), ('Anna', 28), ('Max', 30), ('John', 76)] 

Una cosa importante a tener en cuenta aquí es que esos métodos no devuelven listas reales. Devuelven objetos, que puede utilizar para iterar sobre las claves y los valores. Pero puede encasillar fácilmente esos objetos en listas usando la lista ()función.

Cómo copiar diccionarios en Python

Ahora nos adentramos en cosas más avanzadas.

No creerías cuántas veces los programadores nuevos e inexpertos se meten en problemas porque copian colecciones de forma incorrecta. Solucionan problemas de sus proyectos durante horas y no pueden encontrar el problema.

Así que presta atención aquí si no quieres experimentar esa frustración tú mismo.

Antes de hablar sobre la copia de colecciones y diccionarios, veamos cómo normalmente copiaría tipos de datos primitivos como enteros.

i1 = 20 i2 = i1 i2 += 10 print(i1, i2) # Output: 20 30 

Cuando desee crear una nueva variable y copiar el valor de otro entero en ella, simplemente asigne la variable directamente. Luego puede cambiar el valor del segundo entero y trabajar con él, sin cambiar nada sobre el primero.

Esto también funciona para booleanos, flotantes, cadenas, etc. Sin embargo, veamos qué sucede cuando hacemos esto con un diccionario.

d1 = {'a': 10, 'b': 20, 'c': 30} d2 = d1 d2['c'] = 50 print(d1) print(d2) # Output # {'a': 10, 'b': 20, 'c': 50} # {'a': 10, 'b': 20, 'c': 50} 

What happened here? Didn’t we do the same thing as before? Why does the first dictionary change, when we modify the second one? Isn’t it just a copy?

The answer is a clear no. When you assign a dictionary to a new variable, you are actually passing a so-called reference.

The second variable is not actually a dictionary but just another variable pointing to the same dictionary as the first one. Therefore, it doesn’t matter on which variable you apply changes, since they are all performed on the one dictionary they both are referring to.

If you want to create an actual shallow copy of a dictionary in Python, you need to either use the dict()function or call the copy() method of the dictionary. By doing that you create a new dictionary that has the same elements as the original.

d1 = {'a': 10, 'b': 20, 'c': 30} d2 = dict(d1) d3 = d1.copy() d2['b'] = 50 d3['a'] = -90 print(d1) # unchanged 

Notice, however, that the objects inside the copy are still the exact same objects as in the first dictionary. Therefore, if they are more complex objects or collections, you will end up with a new separate dictionary (but the objects inside it will refer to the same objects as those in the first dictionary).

In order to change that, you would have to make a so-called deep copy, but this is not in the scope of this article.

How to Merge Dictionaries in Python

Last but not least, let's talk about the cutting-edge dictionary features of Python 3.9. These features are focused on merging dictionaries.

Up until recently, programmers had to either use the update() method or make use of the unpacking operators.

d1 = {'a': 10, 'b': 20, 'c': 30} d2 = {'c': 40, 'd': 60, 'e': 20} d1.update(d2) print(d1) d1 = {'a': 10, 'b': 20, 'c': 30} d3 = {**d1, **d2} print(d3) 

The main difference between those two approaches is that the update() method adds the values of one dictionary to another and applies the changes directly. The resulting dictionary is not returned but actually saved into the first object.

When you use the unpacking operators, on the other hand, you create a new dictionary and put the key-value pairs of the two dictionaries into it by unpacking them.

Now you may be asking yourself what happens when you merge two dictionaries that have the same key inside them.

You can think of that like this: The first dictionary creates the key-value pair and the second one overwrites it. So if you call the update method on the first collection and pass the second collection as an argument, the key-value pair of the second dictionary will end up in the result.

The same goes for the unpacking. Whichever dictionary you pass last overwrites the previous ones.

So this is the old way of doing things. In Python 3.9, however, the merging and updating operators were introduced. They make joining dictionaries simpler.

d1 = {'a': 10, 'b': 20, 'c': 30} d2 = {'c': 40, 'd': 60, 'e': 20} d3 = d1 | d2 # Merging d1 |= d2 # Updating 

As you can see, the operator for merging is the same one that's used for the bitwise OR operation. The order of the dictionaries is important if you have identical keys in both dictionaries. The collection on the right overwrites the collection on the left.

If you want to update the first dictionary instead of returning a new one, just combine the merging operator with the basic assignment operator. This way of merging dictionaries is the recommended method since Python 3.9.

If you are more of a visual or auditory learner, you can watch my video tutorial on merging dictionaries below.

Wrapping Up

Alright, so you should now be very comfortable when working with dictionaries. You not only know what they are and how to use them but you also understand how they work on a deeper level.

When working on a project, you will know how to copy dictionaries the right way. We even covered one of the cutting-edge features of the latest Python version.

Make sure you go through the code snippets once again and understand how and why they work. This will make you a much better Python programmer.

If you are interested in more content like this, you can check out my YouTube channel NeuralNine or my website neuralnine.com.

For Python enthusiasts I have a special Python book series that teaches you the language from scratch and also goes into more advanced topics like machine learning and computer vision. You can find it here.

I hope you enjoyed this article and I wish you a great day! :)