Een woordenboek sorteren op waarde in Python

Introductie

Een woordenboek in Python is een verzameling items waarin gegevens worden opgeslagen als sleutel-waardeparen. In Python 3.7 en latere versies worden woordenboeken gesorteerd op volgorde van invoeging van items. In eerdere versies waren ze ongeordend.

In dit artikel bekijken we hoe we een woordenboek kunnen sorteren op basis van de waarden die ze bevatten.

Woordenboek sorteren met a For Ringleiding

We kunnen een woordenboek sorteren met behulp van a for lus. Eerst gebruiken we de sorted() functie om de waarden van het woordenboek te ordenen. We doorlopen vervolgens de gesorteerde waarden en vinden de sleutels voor elke waarde. We voegen deze sleutel-waardeparen in de gesorteerde volgorde toe aan een nieuw woordenboek.

Opmerking: Door te sorteren kunt u het woordenboek niet opnieuw ordenen. We schrijven de geordende paren in een volledig nieuw, leeg woordenboek.

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)

Als u dit uitvoert met de Python-interpreter, ziet u:

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

Nu we hebben gezien hoe te sorteren met lussen, laten we eens kijken naar een populairder alternatief dat gebruik maakt van de sorted() functie.

Woordenboek sorteren met de gesorteerd() Functie

We gebruikten eerder de sorted() functie om de waarden van een array te sorteren. Bij het sorteren van een woordenboek kunnen we nog een argument doorgeven aan de sorted() functioneren als volgt: sorted(dict1, key=dict1.get).

Hier key is een functie die op elk element wordt aangeroepen voordat de waarden worden vergeleken om te sorteren. De get() methode op woordenboekobjecten retourneert de waarde van de sleutel van een woordenboek.

De sorted(dict1, key=dict1.get) expression retourneert de lijst met sleutels waarvan de waarden in volgorde zijn gesorteerd. Van daaruit kunnen we een nieuw, gesorteerd woordenboek maken:

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) 

De sorted() functie heeft de hoeveelheid code verminderd die we moesten schrijven bij gebruik for lussen. We kunnen de echter verder combineren sorted() functie met de itemgetter() functie voor een meer beknopte oplossing voor het sorteren van woordenboeken op waarden.

Woordenboek sorteren met de operator Module en itemgetter()

De operator module bevat de itemgetter() functie. Deze functie retourneert een aanroepbaar object dat een item van een object retourneert.

Laten we bijvoorbeeld itemgetter() om een โ€‹โ€‹oproepbaar object te maken dat de waarde van een woordenboek retourneert met een sleutel die is 2:

import operator

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

print(get_item_with_key_2(dict1))  

Elk woordenboek heeft toegang tot de items() methode. Deze functie retourneert de sleutel-waardeparen van een woordenboek als een lijst met tupels. We kunnen de lijst met tupels sorteren met behulp van de itemgetter() functie om de tweede waarde van de tuple op te halen, dwz de waarde van de sleutels in het woordenboek.

Zodra het is gesorteerd, kunnen we een woordenboek maken op basis van die waarden:

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) 

Met veel minder moeite hebben we een woordenboek gesorteerd op waarden!

Aangezien de key argument accepteert elke functie, we kunnen lambda-functies gebruiken om woordenboekwaarden te retourneren, zodat ze kunnen worden gesorteerd. Laten we eens kijken hoe.

Woordenboek sorteren met een Lambda-functie

Lambda-functies zijn anonieme of naamloze functies in Python. We kunnen lambda-functies gebruiken om de waarde van een woordenboekitem te krijgen zonder de . te hoeven importeren operator module voor itemgetter(). Als je meer wilt weten over lambda's, kun je erover lezen in onze gids voor: Lambda-functies in Python.

Bekijk onze praktische, praktische gids voor het leren van Git, met best-practices, door de industrie geaccepteerde normen en bijgevoegd spiekbriefje. Stop met Googlen op Git-commando's en eigenlijk leren het!

Laten we een woordenboek sorteren op waarden met behulp van een lambda-functie in de key argument van 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)  

Merk op dat de methoden die we tot nu toe hebben besproken alleen werken met Python 3.7 en hoger. Laten we eens kijken wat we kunnen doen voor eerdere versies van Python.

Een nieuw woordenboek met gesorteerde waarden retourneren

Na het sorteren van een woordenboek op waarden, om een โ€‹โ€‹gesorteerd woordenboek in Python-versies vรณรณr 3.7 te behouden, moet je de . gebruiken OrderedDict โ€“ verkrijgbaar in de collections module. Deze objecten zijn woordenboeken die de volgorde van invoegen behouden.

Hier is een voorbeeld van sorteren en gebruiken 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)  

Conclusie

Deze tutorial liet zien hoe een woordenboek kan worden gesorteerd op basis van zijn waarden. We hebben eerst een woordenboek gesorteerd met twee for-lussen. Vervolgens hebben we onze sortering verbeterd met behulp van de sorted() functie. We hebben ook gezien de itemgetter() functie van de operator module kan onze oplossing beknopter maken.

Ten slotte hebben we onze oplossing aangepast om te werken op Python-versies lager dan 3.7.

variaties van de sorted() functie zijn de meest populaire en betrouwbare om een โ€‹โ€‹woordenboek op waarden te sorteren.

Tijdstempel:

Meer van Stapelmisbruik