Ostatnio opisywałem kilka nowości, które weszły do języka Python wraz z wersją 3.9. Następstwem tego wpisu były pytania o to, która wersja Pythona jest najlepsza. Której wersji języka zalecam używać. Czy najnowsza jest najlepsza? A może stosować, którąś ze starszych? Odpowiedź na te i inne pytania znajdziecie w dzisiejszym artykule.
Wtorki z Pythonem
Łączenie zmiennych słownikowych
W krótkim artykule opisującym nowości w języku Python w wydaniu 3.9 zwróciłem uwagę na dwa operatory pozwalające na operowanie na zmiennych typu słownikowego (dict
). W dzisiejszym wpisie w ramach Wtorków z Pythonem pokażę Ci kilka sposobów na łączenie dwóch lub więcej zmiennych słownikowych ze sobą. Pisząc swoje programy do automatyzacji bardzo często będziesz te operacje wykonywać.
Metoda update()
W dzisiejszym artykule posługiwać będę się trzema zmiennymi słownikowymi. Zdefiniuje je w poniższy sposób. Zauważmy, że zarówno w zmiennej x jaki i z występuje klucz ‘a’, lecz ma przypisane inne wartości.
>>> x = {'a': 1, 'b': 2} >>> y = {'c': 3, 'd': 4} >>> z = {'a': 5, 'f': 6}
Pierwsza metoda łączenia ze sobą dwóch zmiennych typu słownikowego polega na wykorzystaniu metody update()
. Gdy wywołamy ją jako metodę zmiennej x jako argument podając zmienną y, to zawartość zmiennej y zostanie doklejona do zmiennej x.
>>> x.update(y) >>> x {'a': 1, 'b': 2, 'c': 3, 'd': 4}
W przypadku, gdy nazwy kluczy się powtarzają, wartość klucza w zmiennej, dla której metoda jest uaktualniana zostanie zaktualizowana
>>> x.update(z) >>> x {'a': 5, 'b': 2, 'f': 6}
Dlatego ważne jest by dokładnie rozumieć kierunek działania metody update()
. Wywołanie jej ze zmiennej z przyniosłoby następujący efekt.
>>> z.update(x) >>> z {'a': 1, 'f': 6, 'b': 2}
Łączenie zmiennych operatorami **
Bliźniaczo podobna do powyższej jest metoda operatorów **
. Wymaga ona jednak zapisania wyniku operacji w trzeciej zmiennej. Nie modyfikuje ona żadnej ze zmiennych, które łączymy jak to miało miejsce w poprzednim przykładzie. Została ona wprowadzona w wydaniu 3.5 języka Python. Nie jest ona zbyt intuicyjna w swoim zapisie i niewielu programistów z niej korzystało.
>>> u = { **x, **y} >>> u {'a': 1, 'b': 2, 'c': 3, 'd': 4} >>> w = { **x, **z} >>> w {'a': 5, 'b': 2, 'f': 6}
Jak widać w przypadku powtarzających się kluczy nadpisana zostanie wartość tego z lewej strony. Zaletą tej metody jest jednak to, że w pojedynczym zapisie możemy połączyć ze sobą wiele zmiennych słownikowych. Operacje łączenia wykonują się od lewej do prawej.
>>> t = { **x, **y, **z} >>> t {'a': 5, 'b': 2, 'c': 3, 'd': 4, 'f': 6}
Połączyć dwie zmienne słownikowe możemy jeszcze tworząc trzecią zmienną jawną deklaracją typu, czyli dict(x, **y)
. Metoda ta działa jednak jedynie w przypadku, gdy wszystkie klucze w słownikach są tekstem.
Operatory w Python 3.9
W Python 3.9 wprowadzono operacje na zmiennych słownikowych za pomocą operatorów union (|
) oraz in-place union (|=
). Pierwszy z nich jest odpowiednikiem zapisu {**x, **y}
.
>>> x | y {'a': 1, 'b': 2, 'c': 3, 'd': 4} >>> x | z {'a': 5, 'b': 2, 'f': 6} >>> x | y | z {'a': 5, 'b': 2, 'c': 3, 'd': 4, 'f': 6}
Sam operator |
nie modyfikuje wartości żadnej ze zmiennych. Wynik operacji możemy przypisać do nowej zmiennej. Inaczej zachowuje się operator |=
, który połączoną wartość zapisuje w zmiennej po lewej stronie wywołania. Jest on zatem odpowiednikiem wywołania metody update()
.
>>> x |= y >>> x {'a': 1, 'b': 2, 'c': 3, 'd': 4} >>> y {'c': 3, 'd': 4}
Jak widzisz łączenie zmiennych słownikowych można wykonać na wiele sposobów. Wybierz odpowiedni dla swojego programu. Koniecznie pamiętaj, która metoda nadpisuje wartość jednej z łączonych zmiennych aby nie stracić przetwarzanych danych.
Przez Piotr Wojciechowski, temu