W tym przewodniku omówimy, jak uporządkować słownik w języku Python, bazując na jego kluczach lub wartościach.
Podczas pracy ze słownikami w Pythonie, czasem konieczne jest ich posortowanie – czy to według kluczy, czy wartości. Zważywszy na to, że słownik w Pythonie to struktura typu klucz-wartość, utworzymy nowy słownik, gdzie klucze lub wartości będą uporządkowane zgodnie z potrzebami.
Zaczniemy od przypomnienia podstawowych zasad działania słowników w Pythonie. Następnie pokażemy, jak stworzyć nowy słownik, którego zawartość będzie ułożona według kluczy lub wartości, zależnie od twoich preferencji.
Powtórka z podstaw słownika Pythona
Czym jest słownik w Pythonie?
Słownik to wbudowana struktura danych w Pythonie, która przechowuje elementy w postaci par klucz-wartość. Klucze umożliwiają szybkie wyszukiwanie powiązanych wartości. Klucze muszą być unikalne, ponieważ to one jednoznacznie identyfikują wartości.
py_dict = {"Python":"świetny!","Nauka":True} py_dict["Python"] # Wynik: świetny! py_dict["Nauka"] # Wynik: True
Słownik w działaniu przypomina tablicę asocjacyjną. Z tego powodu nie jest to uporządkowana struktura danych. Dostęp do elementów słownika można uzyskać w dowolnej kolejności, pod warunkiem znajomości kluczy.
Kolejność elementów w słowniku
W poprzednich wersjach Pythona, aby zachować porządek kluczy, konieczne było użycie OrderedDict. Jednak od wersji 3.7, elementy słownika są dostępne w kolejności, w jakiej zostały do niego dodane.
Teraz, mając podstawową wiedzę o słownikach Pythona, nauczmy się tworzyć ich posortowane kopie.
⚙️ Uwaga: Aby kod z tego samouczka działał poprawnie, wymagana jest wersja Pythona 3.7 lub nowsza. Możesz pobrać najnowszą wersję Pythona lub uruchomić przykłady w edytorze online Python na stronie newsblog.pl.
Jak posortować słownik w Pythonie według klucza
Spójrz na poniższe menu deserów z kawiarni. Widzimy dwie kolumny: nazwy pozycji i ich ceny.
Możemy przedstawić to w formie słownika Pythona, gdzie nazwy deserów będą kluczami, a ich ceny – wartościami.
Stwórzmy taki słownik deserów, jak poniżej.
desery = { "Lody":10, "Brownie":12, "Sernik":3, "Rolada szwajcarska":5, "Ciasteczka":4, "Babeczka":2 }
Teraz utwórzmy słownik posortowane_desery, w którym desery będą ułożone w porządku alfabetycznym. W oryginalnym słowniku kluczami są nazwy deserów. Dlatego, aby utworzyć nowy słownik, musimy posortować klucze alfabetycznie.
Jak pobrać klucze słownika Pythona
Aby to zrobić, najpierw pobierzemy wszystkie klucze słownika, a potem posortujemy je alfabetycznie.
W Pythonie mamy do dyspozycji wbudowaną metodę .keys(), która pozwala uzyskać listę wszystkich kluczy słownika.
Wywołajmy tę metodę na słowniku deserów, aby pobrać klucze, jak niżej.
klucze = desery.keys() print(klucze) #Wynik ['Lody', 'Brownie', 'Sernik', 'Rolada szwajcarska', 'Ciasteczka', 'Babeczka']
Użycie wbudowanej funkcji sorted() Pythona z listą jako argumentem, zwróci nową, posortowaną listę.
Wywołajmy więc funkcję sorted() z kluczami jako argumentem i zapiszmy posortowaną listę w zmiennej posortowane_klucze.
posortowane_klucze = sorted(klucze) print(posortowane_klucze) # Wynik ['Babeczka', 'Brownie', 'Ciasteczka', 'Lody', 'Rolada szwajcarska', 'Sernik']
Mając już klucze posortowane alfabetycznie, możemy teraz wyszukać odpowiadające im wartości z oryginalnego słownika deserów, jak poniżej.
posortowane_desery = {} for klucz in posortowane_klucze: posortowane_desery[klucz] = desery[klucz] print(posortowane_desery) # Wynik {'Babeczka': 2, 'Brownie': 12, 'Ciasteczka': 4, 'Lody': 10, 'Rolada szwajcarska': 5, 'Sernik': 3}
Rozbijmy powyższy blok kodu:
- Inicjujemy posortowane_desery jako pusty słownik Pythona.
- Iterujemy po liście posortowanych kluczy.
- Dla każdego klucza dodajemy wpis do posortowane_desery, wyszukując odpowiednią wartość w słowniku deserów.
Używanie pętli for w ten sposób jest nieco rozwlekłe. Python oferuje bardziej zwięzłą alternatywę, czyli tzw. „dictionary comprehension”.
Rozumienie słownika w Pythonie
Python, podobnie jak listy, obsługuje tzw. „dictionary comprehension”. To mechanizm pozwalający na tworzenie nowego słownika Pythona za pomocą jednej linijki kodu.
▶️ Ogólna składnia rozumienia słownika w Pythonie wygląda tak:
# 1. gdy klucze i wartości są w dwóch listach: lista1, lista2 nowy_slownik = {klucz:wartosc for klucz,wartosc in zip(lista1,lista2)} # 2. gdy mamy klucze i możemy wyszukać wartości nowy_slownik = {klucz:wartosc for klucz in <iterable>}
Użyjmy drugiej składni: nowy_slownik = {klucz:wartość dla klucza w <iterable>}, aby utworzyć słownik posortowane_desery.
W tym przypadku:
- iterowalne: lista posortowane_klucze
- klucz: aktualny klucz podczas iteracji po posortowane_klucze
- wartość: wartość odpowiadająca kluczowi z słownika desery, czyli desery[klucz]
Podsumowując, otrzymujemy takie wyrażenie dla naszego słownika:
posortowane_desery = {klucz:desery[klucz] for klucz in posortowane_klucze} print(posortowane_desery) {'Babeczka': 2, 'Brownie': 12, 'Ciasteczka': 4, 'Lody': 10, 'Rolada szwajcarska': 5, 'Sernik': 3}
Jak widzimy, desery w słowniku posortowane_desery są teraz ułożone w porządku alfabetycznym.
Jak posortować słownik Pythona według wartości
Teraz zajmiemy się sortowaniem słownika Pythona według jego wartości.
W słowniku desery wartościami są ceny poszczególnych deserów. Możemy posortować ten słownik według cen, rosnąco lub malejąco.
▶️ Do pobrania wszystkich par klucz-wartość służy wbudowana metoda .items(). Każdy element jest parą klucz-wartość.
desery.items() dict_items([('Lody', 10), ('Brownie', 12), ('Sernik', 3), ('Rolada szwajcarska', 5), ('Ciasteczka', 4), ('Babeczka', 2)])
Każdy element jest tu krotką. Możemy indeksować każdą parę klucz-wartość, aby uzyskać dostęp do klucza lub wartości.
dict_items = desery.items() for item in dict_items: print(f"klucz:{item[0]},wartosc:{item[1]}") # Wynik klucz:Lody,wartosc:10 klucz:Brownie,wartosc:12 klucz:Sernik,wartosc:3 klucz:Rolada szwajcarska,wartosc:5 klucz:Ciasteczka,wartosc:4 klucz:Babeczka,wartosc:2
Ponieważ chcemy sortować według wartości, skorzystamy z powyższej metody, aby uzyskać dostęp do wartości pod indeksem 1 w każdej parze klucz-wartość.
Jak posortować wartości słownika Pythona rosnąco
Tym razem użyjemy funkcji sorted() z opcjonalnym parametrem key. Parametr key może być dowolną funkcją Pythona: funkcją wbudowaną, funkcją zdefiniowaną przez użytkownika, a nawet funkcją lambda.
Uwaga: `lambda argumenty: wyrażenie` to składnia służąca do definiowania funkcji lambda w Pythonie.
W tym przypadku sortowania deserów według ceny, mamy dostęp do elementów słownika (par klucz-wartość). Ustawiamy klucz = lambda item:item[1], ponieważ chcemy sortować według wartości (ceny).
Ponieważ funkcja sorted() domyślnie zwraca listę, powinniśmy ją jawnie przekonwertować na słownik, jak poniżej.
posortowane_desery = dict(sorted(desery.items(), key=lambda item:item[1])) print(posortowane_desery) {'Babeczka': 2, 'Sernik': 3, 'Ciasteczka': 4, 'Rolada szwajcarska': 5, 'Lody': 10, 'Brownie': 12}
Możemy też zapisać to za pomocą rozumienia słownika, jak wcześniej.
posortowane_desery = {klucz:wartosc for klucz, wartosc in sorted(desery.items(), key=lambda item:item[1])} print(posortowane_desery) # Wynik {'Babeczka': 2, 'Sernik': 3, 'Ciasteczka': 4, 'Rolada szwajcarska': 5, 'Lody': 10, 'Brownie': 12}
W słowniku posortowane_desery pierwszym elementem jest babeczka za 2 zł, a ostatnim brownie za 12 zł.
Jak posortować wartości słownika Pythona malejąco
Aby posortować ceny malejąco, musimy ustawić opcjonalny parametr reverse na True, jak pokazano poniżej.
posortowane_desery = dict(sorted(desery.items(), key=lambda item:item[1], reverse=True)) print(posortowane_desery) # Wynik {'Brownie': 12, 'Lody': 10, 'Rolada szwajcarska': 5, 'Ciasteczka': 4, 'Sernik': 3, 'Babeczka': 2}
Teraz słownik posortowane_desery jest uporządkowany malejąco według cen, zaczynając od najdroższego brownie za 12 zł.
Podsumowanie 👩🏽💻
Podsumujmy, czego nauczyliśmy się w tym przewodniku:
- Słownik Pythona przechowuje dane w parach klucz-wartość; wszystkie klucze muszą być unikalne.
- Sortowanie słownika po kluczach lub wartościach polega na tworzeniu nowego, posortowanego słownika.
- Metody .keys() i .items() umożliwiają pobranie odpowiednio wszystkich kluczy i par klucz-wartość ze słownika.
- Funkcja sorted() wraz z opcjonalnym parametrem key i reverse pozwala na osiągnięcie pożądanego sortowania.
Teraz, gdy opanowałeś sortowanie słowników w Pythonie, możesz nauczyć się sortowania list. Życzymy owocnego kodowania! 🎉
newsblog.pl