Jak posortować słownik według wartości w Pythonie?

Wprowadzenie

Słownik w Pythonie to zbiór elementów, które przechowują dane jako pary klucz-wartość. W Pythonie 3.7 i nowszych wersjach słowniki są sortowane według kolejności wstawiania elementów. We wcześniejszych wersjach były nieuporządkowane.

W tym artykule przyjrzymy się, jak możemy sortować słownik na podstawie zawartych w nim wartości.

Sortuj słownik za pomocą dla Pętla

Słownik możemy posortować za pomocą a for pętla. Najpierw używamy sorted() funkcja porządkująca wartości słownika. Następnie przechodzimy przez posortowane wartości, znajdując klucze dla każdej wartości. Dodajemy te pary klucz-wartość w posortowanej kolejności do nowego słownika.

Uwaga: Sortowanie nie pozwala na zmianę kolejności słownika w miejscu. Zamówione pary zapisujemy w zupełnie nowym, pustym słowniku.

dict1 = {1: 1, 2: 9, 3: 4}
sorted_values = sorted(dict1.values()) 
sorted_dict = {}

for i in sorted_values:
    for k in dict1.keys():
        if dict1[k] == i:
            sorted_dict[k] = dict1[k]

print(sorted_dict)

Jeśli uruchomisz to za pomocą interpretera Pythona, zobaczysz:

{1: 1, 3: 4, 2: 9}

Teraz, gdy widzieliśmy, jak sortować za pomocą pętli, spójrzmy na bardziej popularną alternatywę, która używa sorted() funkcja.

Sortuj słownik za pomocą posortowane () Funkcjonować

Wcześniej używaliśmy sorted() funkcja sortowania wartości tablicy. Podczas sortowania słownika możemy przekazać jeszcze jeden argument do sorted() działają w ten sposób: sorted(dict1, key=dict1.get).

Tutaj, key to funkcja, która jest wywoływana na każdym elemencie przed porównaniem wartości w celu sortowania. The get() Metoda na obiektach słownika zwraca wartość klucza słownika.

Połączenia sorted(dict1, key=dict1.get) wyrażenie zwróci listę kluczy, których wartości są posortowane w kolejności. Stamtąd możemy stworzyć nowy, posortowany słownik:

dict1 = {1: 1, 2: 9, 3: 4}
sorted_dict = {}
sorted_keys = sorted(dict1, key=dict1.get)  

for w in sorted_keys:
    sorted_dict[w] = dict1[w]

print(sorted_dict) 

Korzystanie z sorted() funkcja zmniejszyła ilość kodu, który musieliśmy napisać podczas używania for pętle. Możemy jednak dalej łączyć sorted() funkcja z itemgetter() funkcja dla bardziej zwięzłego rozwiązania sortowania słowników według wartości.

Sortuj słownik za pomocą operator Moduł i pobieranie przedmiotów()

Połączenia operator moduł zawiera itemgetter() funkcjonować. Ta funkcja zwraca wywoływalny obiekt, który zwraca element z obiektu.

Na przykład użyjmy itemgetter() utworzyć wywoływalny obiekt, który zwraca wartość dowolnego słownika z kluczem, który jest 2:

import operator

dict1 = {1: 1, 2: 9}
get_item_with_key_2 = operator.itemgetter(2)

print(get_item_with_key_2(dict1))  

Każdy słownik ma dostęp do items() metoda. Ta funkcja zwraca pary klucz-wartość słownika jako listę krotek. Listę krotek możemy posortować za pomocą itemgetter() funkcja do pobrania drugiej wartości krotki, czyli wartości kluczy w słowniku.

Po posortowaniu możemy utworzyć słownik na podstawie tych wartości:

import operator

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict) 

Przy znacznie mniejszym wysiłku mamy słownik posortowany według wartości!

Jak key argument przyjmuje dowolną funkcję, możemy użyć funkcji lambda do zwrócenia wartości słownikowych, aby można je było posortować. Zobaczmy jak.

Sortuj słownik za pomocą funkcji lambda

Funkcje lambda są anonimowymi lub bezimiennymi funkcjami w Pythonie. Możemy użyć funkcji lambda, aby uzyskać wartość elementu słownika bez konieczności importowania operator moduł dla itemgetter(). Jeśli chcesz dowiedzieć się więcej o lambdach, przeczytaj o nich w naszym poradniku Funkcje lambda w Pythonie.

Zapoznaj się z naszym praktycznym, praktycznym przewodnikiem dotyczącym nauki Git, zawierającym najlepsze praktyki, standardy przyjęte w branży i dołączoną ściągawkę. Zatrzymaj polecenia Google Git, a właściwie uczyć się to!

Posortujmy słownik według wartości za pomocą funkcji lambda w key argument sorted():

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=lambda item: item[1])
print(sorted_tuples)  
sorted_dict = {k: v for k, v in sorted_tuples}

print(sorted_dict)  

Zauważ, że metody, które omówiliśmy do tej pory, działają tylko w Pythonie 3.7 i nowszych. Zobaczmy, co możemy zrobić dla wcześniejszych wersji Pythona.

Zwracanie nowego słownika z posortowanymi wartościami

Po posortowaniu słownika według wartości, aby zachować posortowany słownik w wersjach Pythona przed 3.7, musisz użyć OrderedDict – dostępny w collections moduł. Te obiekty to słowniki, które zachowują kolejność wstawiania.

Oto przykład sortowania i używania OrderedDict:

import operator
from collections import OrderedDict

dict1 = {1: 1, 2: 9, 3: 4}
sorted_tuples = sorted(dict1.items(), key=operator.itemgetter(1))
print(sorted_tuples)  

sorted_dict = OrderedDict()
for k, v in sorted_tuples:
    sorted_dict[k] = v

print(sorted_dict)  

Wnioski

W tym samouczku pokazano, jak można sortować słownik na podstawie jego wartości. Najpierw posortowaliśmy słownik za pomocą dwóch pętli for. Następnie ulepszyliśmy nasze sortowanie, używając sorted() funkcjonować. Widzieliśmy też itemgetter() funkcja z operator moduł może sprawić, że nasze rozwiązanie będzie bardziej zwięzłe.

Na koniec dostosowaliśmy nasze rozwiązanie do pracy na wersjach Pythona niższych niż 3.7.

Odmiany sorted() Funkcja to najbardziej popularne i niezawodne sortowanie słownika według wartości.

Znak czasu:

Więcej z Nadużycie stosu