Przewodnik po słowniku Pythona - jak iterować, kopiować i łączyć słowniki w Pythonie 3.9

Python to popularny język do nauki o danych. Praca z kolekcjami to jedna z najbardziej podstawowych umiejętności, które musisz posiadać.

Kolekcje to struktury danych, które zawierają wiele elementów różnych typów danych.

Dzisiaj przyjrzymy się dokładniej słownikom, które są specjalnym typem zbioru w Pythonie. Omówimy ich podstawową funkcjonalność, ich wewnętrzne działanie, a także niektóre nowatorskie funkcje najnowszej wersji Pythona.

Będziesz wiedział pod koniec tego samouczka

  • Jakie są słowniki
  • Jak pracować ze słownikami
  • Jak iterować po słownikach
  • Jak kopiować słowniki
  • Jak połączyć słowniki w Pythonie 3.9

Czym są słowniki w Pythonie?

Zanim dowiesz się czegoś dogłębnego, zawsze dobrze jest zacząć od prostej i podstawowej definicji.

Jak już powiedziałem, słowniki są rodzajem kolekcji w Pythonie. Jednak w przeciwieństwie do list, krotek i zestawów, nie przechowujesz pojedynczych wartości, ale tak zwane pary klucz-wartość . Oznacza to, że zamiast odwoływać się do swoich wartości za pośrednictwem indeksu, używasz klucza, który jest unikalnym identyfikatorem.

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 

W powyższym przykładzie widać różnicę. Poszczególne pary klucz-wartość są oddzielone przecinkami. Każda para zaczyna się od unikalnego klucza, po którym następuje dwukropek i odpowiednia wartość. Zwróć uwagę, że wartość nie musi być unikalna, ponieważ nie używamy jej do uzyskiwania dostępu lub identyfikowania czegokolwiek.

Pamiętaj również, że możemy użyć dowolnego typu danych dla kluczy i wartości, które chcemy. Tutaj używamy tylko łańcuchów jako identyfikatorów, ale możemy również używać liczb całkowitych, liczb zmiennoprzecinkowych, kolekcji, a nawet wartości logicznych.

Jednak zawsze powinieneś zadać sobie pytanie, jak rozsądne jest to. W większości przypadków najlepszym wyborem będzie sznurek.

Jak pracować ze słownikami w Pythonie

W porządku, skoro już wiemy, czym są słowniki, przyjrzyjmy się, jak z nimi pracować.

Najpierw przejdziemy przez podstawowe operacje, takie jak dostęp, dodawanie i usuwanie wartości. Następnie przyjrzymy się bardziej zaawansowanym i interesującym tematom.

Możesz uzyskać dostęp do elementów słownika w Pythonie w taki sam sposób, jak do elementów z dowolnej innej kolekcji. Jedyną różnicą jest to, że przekazujesz klucz, a nie indeks. Dotyczy to również zmiany, a nawet dołączania wartości.

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']) 

Jak widać tutaj, wystarczy przekazać klucz, aby uzyskać dostęp do wartości, do której się odnosi. Najpierw drukujesz nazwę, a następnie ją zmieniasz. Następnie drukujesz go ponownie, aby upewnić się, że zmiany zostały wprowadzone.

Zauważ, że to działa nie tylko dla już istniejących par, ale także dla nowych. Aby utworzyć nową parę klucz-wartość, po prostu odwołaj się do klucza, który jeszcze nie istnieje, i przypisz mu wartość. Para zostanie następnie automatycznie dodana do słownika.

Usuwanie wartości ze słownika działa inaczej. Tutaj możesz użyć delsłowo kluczowe lub metodę pop () .

Główna różnica między tymi dwoma podejściami polega na tym, że del usuwa tylko parę klucz-wartość, podczas gdy pop () również zwraca później usuniętą wartość. W zależności od twojego przypadku użycia będziesz musiał zdecydować, która metoda lepiej pasuje do twojego zadania.

Jak iterować słowniki w Pythonie

Ponieważ słowniki są zbiorami, można je również iterować. Ale nie jest to tak proste i proste, jak w przypadku innych typów kolekcji.

Dzieje się tak, ponieważ nie masz do czynienia z pojedynczymi wartościami, ale z parami. Kiedy iterujesz po słowniku, używając pętli for, tak naprawdę po prostu przechodzisz po klawiszach.

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

Dlatego jeśli chcesz iterować po wartościach lub nawet całych parach, musisz użyć dodatkowych metod.

Aby uzyskać dostęp do wartości, wystarczy wywołać wartości ()metoda. Zwraca iterator dla wszystkich wartości ze słownika.

Aby uzyskać dostęp do pełnych par, możesz wywołać elementy ()metoda. Tutaj wykonujesz iterację po liście krotek, gdzie każda krotka reprezentuje jedną parę klucz-wartość.

Oczywiście istnieje również metoda keys () , na wypadek gdybyś chciał pracować z kluczami słownika poza pętlą 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)] 

Należy tutaj pamiętać, że metody te nie zwracają rzeczywistych list. Zwracają obiekty, których możesz użyć do iteracji po kluczach i wartościach. Ale możesz łatwo typecastować te obiekty na listy, używając list ()funkcjonować.

Jak skopiować słowniki w Pythonie

Teraz przechodzimy do bardziej zaawansowanych rzeczy.

You wouldn't believe how many times new and inexperienced programmers run into trouble because they copy collections the wrong way. They troubleshoot their projects for hours and are unable to find the problem.

So pay attention here if you don’t want to experience that frustration yourself.

Before we talk about copying collections and dictionaries, let's look at how you would usually copy primitive data types like integers.

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

When you want to create a new variable and copy the value of another integer into it, you just directly assign the variable. Then you can change the value of the second integer and work with it, without changing anything about the first one.

This also works for Booleans, Floats, Strings etc. However, let’s see what happens, when we do this with a dictionary.

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! :)