Nasza strona używa cookies. Korzystając ze strony, wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki. Rozumiem

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

Eden Au Advisory Board Member / projectaccess.co
Sprawdź, w jaki sposób Python 3.9 ułatwia łączenie ze sobą słowników (ang. Python Dictionaries) względem tego, jak wyglądało to w poprzednich wersjach.
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:


Przyjemnego kodowania!

Nie przegap treści Bulldogjob
Subskrybuj artykuły

Lubisz dzielić się wiedzą i chcesz zostać autorem?

Podziel się wiedzą z 160 tysiącami naszych czytelników

Dowiedz się więcej