Jak posortować słownik Pythona według klucza lub wartości

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