Ръководство за речник на Python - Как да прегледате, копирате и обедините речници в Python 3.9

Python е популярен език за науката за данни. А работата с колекции е едно от най-основните умения, които трябва да притежавате.

Колекциите са структури от данни, които съдържат множество елементи от различни различни типове данни.

Днес ще разгледаме подробно речниците, които са специален тип колекция в Python. Ще разгледаме тяхната основна функционалност, вътрешната им работа, както и някои модерни функции на най-новата версия на Python.

До края на този урок ще разберете

  • Какво представляват речниците
  • Как се работи с речници
  • Как да прегледате речници
  • Как да копирате речници
  • Как да обединим речници в Python 3.9

Какво представляват речниците в Python?

Преди да научите нещо в дълбочина, винаги е добре да започнете с просто и основно определение.

Както вече казах, речниците са вид колекция в Python. Въпреки това, за разлика от списъци, кортежи и набори, вие не съхранявате отделни стойности, а така наречените двойки ключ-стойност . Това означава, че вместо да се позовавате на вашите стойности чрез индекс, вие използвате ключ, който е уникален идентификатор.

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 

В горния пример можете да видите разликата. Отделните двойки ключ-стойност са разделени със запетаи. Всяка двойка започва с уникален ключ, последван от двоеточие и съответната стойност. Забележете, че стойността не трябва да е уникална, тъй като не я използваме за достъп или идентифициране на нещо.

Също така имайте предвид, че можем да използваме всеки тип данни за ключовете и стойностите, които искаме. Тук използваме само низове за идентификаторите, но можем да използваме и цели числа, плувки, колекции или дори булеви числа.

Винаги обаче трябва да се питате колко разумно е това. През повечето време низът ще бъде най-добрият избор.

Как да работя с речници в Python

Добре, сега, след като знаем какво са речници, нека да разгледаме как да работим с тях.

Първо ще преминем през основните операции като достъп, добавяне и премахване на стойности. След това ще разгледаме някои по-напреднали и по-интересни теми.

Можете да получите достъп до елементи на речник в Python по същия начин, както до елементите от всяка друга колекция. Единствената разлика е, че предавате ключ, а не индекс. Това важи и за промяна и дори за добавяне на стойности.

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

Както можете да видите тук, просто подавате ключ за достъп до стойността, към която се отнася. Първо отпечатвате името, след което го променяте. След това го отпечатвате отново, за да сте сигурни, че промените са направени.

Забележете, че това не работи само за вече съществуващи двойки, но и за нови. За да създадете нова двойка ключ-стойност, просто се обърнете към ключ, който все още не съществува, и му задайте стойност. След това двойката се добавя към речника автоматично.

Премахването на стойности от речник работи по различен начин. Тук можете да използвате delключова дума или метод pop () .

Основната разлика между тези два подхода е, че del само премахва двойката ключ-стойност, докато pop () също връща премахнатата стойност след това. В зависимост от вашия случай на употреба ще трябва да решите кой метод по-добре отговаря на вашата задача.

Как да преглеждам речниците в Python

Тъй като речниците са колекции, можете също да ги прегледате. Но това не е толкова просто и ясно, колкото е при другите типове колекции.

Това е така, защото не се занимавате с отделни ценности, а с двойки. Когато преглеждате речник, използвайки цикъл for, вие всъщност просто преглеждате ключовете.

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

Следователно, ако искате да прегледате стойностите или дори целите двойки, трябва да използвате допълнителни методи.

За да получите достъп до стойностите, просто трябва да извикате стойностите ()метод. Той връща итератор за всички стойности на речника.

За достъп до пълните двойки можете да извикате елементите ()метод. Тук преглеждате списък от кортежи, където всеки кортеж представлява една двойка ключ-стойност.

Разбира се, има и методът keys () , в случай че искате да работите с речниковите ключове извън цикъл 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)] 

Едно важно нещо, което трябва да имате предвид тук, е, че тези методи не връщат действителните списъци. Те връщат обекти, които можете да използвате, за да прегледате ключовете и стойностите. Но можете лесно да въведете тези обекти в списъци, като използвате списъка ()функция.

Как да копирате речници в Python

Сега навлизаме в някои по-напреднали неща.

Не бихте повярвали колко пъти нови и неопитни програмисти срещат проблеми, защото копират колекции по грешен начин. Те отстраняват проблемите си с часове и не могат да открият проблема.

Затова обърнете внимание тук, ако не искате сами да изпитате това разочарование.

Преди да говорим за копиране на колекции и речници, нека разгледаме как обикновено бихте копирали примитивни типове данни като цели числа.

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

Когато искате да създадете нова променлива и да копирате стойността на друго цяло число в нея, просто директно присвоявате променливата. След това можете да промените стойността на второто цяло число и да работите с него, без да променяте нищо за първото.

Това работи и за Booleans, Floats, Strings и др. Нека обаче видим какво се случва, когато правим това с речник.

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