Python Dictionaries - jak połączyć ze sobą słowniki Pythona

W Python 3.9 wprowadzono rewolucyjną funkcję, która pozwala na pisanie bardziej czytelnego i zwartego kodu, podczas obsługi słowników Pythona.
Wersje Pythona
Jakiś czas temu pisałem o 6 nowych funkcjach w Pythonie 3.8, o których powinien pamiętać nawet początkujący. Python 3.9 jest teraz w fazie beta, gdzie nie można już proponować żadnych nowych funkcji. Pierwsze stabilne wydanie powinno być dostępne w październiku 2020 r. Harmonogram wydania można znaleźć tutaj. Jest tam nowa funkcja, która dotyczy słowników.
Słowniki Pythona
Słownik jest dość unikalną strukturą danych w Pythonie. Zawiera on wiele elementów, a każdy z nich jest parą klucz-wartość. Zainicjujmy, na przykład, słownik d1
z dwoma elementami. Kluczowe name
ma wartość Tom
, natomiast kluczowe age
ma wartość 20
.
d1 = {'name': 'Tom', 'age': 20}
Mamy teraz słownik przechowujący informacje o 20-letnim Tomie. Załóżmy, że masz jeszcze trochę informacji o Tomie. Mamy do tego inny słownik o nazwie d2
.
d2 = {'gpa': 4.0, 'is_single': True}
Chcemy zatem połączyć te dwa słowniki razem, ponieważ oba zawierają różne informacje o tej samej osobie.
Pytanie tylko, jak to zrobić?
Niezdarny sposób
Możesz wstawić nowy element do istniejącego słownika za pomocą operatora przypisania =
o składni dict_name[key] = value
.
d1 = {'name': 'Tom', 'age': 20}
d1['sex'] = 'Male'
# d1 == {'name': 'Tom', 'age': 20, 'sex': 'Male'}
Dlatego, bez użycia metod specyficznych dla słowników, pierwszą rzeczą, która przychodzi na myśl, jest napisanie pętli for, która będzie iterowała po każdej parze klucz-wartość za pomocą iterowalnego .items()
, a następnie wstawienie pary do nowego słownika dnew
.
d1 = {'name': 'Tom', 'age': 20}
d2 = {'gpa': 4.0, 'is_single': True}
dnew = dict()
for key, value in d1.items():
dnew[key] = value
for key, value in d2.items():
dnew[key] = value
# dnew == {'name': 'Tom', 'age': 20, 'gpa': 4.0, 'is_single': True}
Niemniej jednak scalanie słowników powinno być czymś naprawdę prostym, no i powinno odbywać się w jednym wierszu kodu.
Stać nas na więcej.
Domyślny sposób
Właściwie to istnieje wbudowana metoda, która pozwala na „aktualizację” słownika d1
za pomocą innego słownika d2
.
dnew = d1.copy()
dnew.update(d2)
Wadą jest jedynie to, że .update()
modyfikuje słownik w miejscu. Trzeba będzie utworzyć nowy słownik dnew, kopiując d1
. Przez to wykorzystanie tej metody często może nie być najlepsze do łączenia słowników.
Czy możemy je łączyć w jednej linijce kodu? Tak.
Porządny sposób
Python obsługuje rozpakowywanie słowników za pomocą **
, począwszy od wersji 3.5. Możesz utworzyć nowy „scalony” słownik, rozpakowując elementy dwóch słowników.
dnew = {**d1, **d2}
Metoda ta staje się de facto podejściem polegającym na łączeniu słowników z Python 3.5+. Taka składnia może jednak brzydko wyglądać i z pewnością nie jest też intuicyjna. Istnieje inny sposób na scalenie słowników w jednej linijce kodu, ale on też nie wygląda intuicyjnie.
dnew = dict(d1, **d2)
Czysty sposób w Pythonie 3.9
Python 3.9 wprowadza nowy i czysty sposób łączenia słowników za pomocą operatora |
.
dnew = d1 | d2
# dnew == {'name': 'Tom', 'age': 20, 'gpa': 4.0, 'is_single': True}
Operator Union nie jest jednak nowy w Pythonie — można go użyć do połączenia dwóch zbiorów (ang. set). Set to nieuporządkowana i nieindeksowana kolekcja zapisana między nawiasami klamrowymi.
a = {1, 2, 3}
b = {3, 4, 5}
print( a | b )
# {1, 2, 3, 4, 5}
Modyfikująca instrukcja przypisania
W przypadku dwóch list lub dwóch wartości, a
oraz b
, a += b
jest krótką formą a = a+b
. Taki rodzaj przypisania działa na podobnej zasadzie dla słowników i operatora unii. Oznacza to, że d1 |= d2
, co równa się d1 = d1 | d2
.
Uwagi
Set jest nieuporządkowany. Słownik jest uporządkowany przez kolejność wstawiania (od Python 3.6). Innymi słowy, słowniki zapamiętują kolejność wstawianych elementów. Oznacza to, że łączenie słownikowe nie jest przemienne, a zatem d1 | d2
i d2 | d1
spowodowałoby połączenie słowników w różnych kolejnościach.
W Pythonie 3.9 pojawiły się także inne nowe funkcje, w tym zaktualizowane adnotacje zmiennych. Zobacz następujące artykuły, aby dowiedzieć się więcej:
- https://towardsdatascience.com/5-python-features-i-wish-i-had-known-earlier-bc16e4a13bf4
- https://towardsdatascience.com/4-common-mistakes-python-beginners-should-avoid-89bcebd2c628
Przyjemnego kodowania!