Hur man sorterar en ordbok efter värde i Python

Beskrivning

En ordbok i Python är en samling objekt som lagrar data som nyckel-värdepar. I Python 3.7 och senare versioner sorteras ordlistor efter ordningen för insättning av objekt. I tidigare versioner var de oordnade.

I den här artikeln ska vi ta en titt på hur vi kan sortera en ordbok utifrån de värden den innehåller.

Sortera ordbok med hjälp av en för loop

Vi kan sortera en ordbok med hjälp av en for slinga. Först använder vi sorted() funktion för att ordna värdena i ordboken. Vi går sedan igenom de sorterade värdena och hittar nycklarna för varje värde. Vi lägger till dessa nyckel-värdepar i sorterad ordning i en ny ordbok.

Notera: Sortering tillåter dig inte att ordna om ordlistan på plats. Vi skriver de beställda paren i en helt ny, tom ordbok.

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)

Om du kör detta med Python-tolken skulle du se:

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

Nu när vi har sett hur man sorterar med loopar, låt oss titta på ett mer populärt alternativ som använder sorted() funktion.

Sortera ordbok med hjälp av sorterad() Funktion

Vi använde tidigare sorted() funktion för att sortera värdena för en matris. När vi sorterar en ordbok kan vi skicka ytterligare ett argument till sorted() fungerar så här: sorted(dict1, key=dict1.get).

Här, key är en funktion som anropas på varje element innan värdena jämförs för sortering. De get() metod på ordboksobjekt returnerar värdet på en ordboksnyckel.

Smakämnen sorted(dict1, key=dict1.get) expression returnerar listan över nycklar vars värden är sorterade i ordning. Därifrån kan vi skapa en ny, sorterad ordbok:

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) 

Använda sorted() funktionen har minskat mängden kod vi var tvungna att skriva när vi använde for slingor. Men vi kan kombinera ytterligare sorted() funktion med itemgetter() funktion för en mer kortfattad lösning för att sortera ordböcker efter värden.

Sortera ordbok med hjälp av Operatören Modul och itemgetter()

Smakämnen operator modulen innehåller itemgetter() fungera. Denna funktion returnerar ett anropsbart objekt som returnerar ett objekt från ett objekt.

Till exempel, låt oss använda itemgetter() för att skapa ett anropsbart objekt som returnerar värdet av valfri ordbok med en nyckel som är 2:

import operator

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

print(get_item_with_key_2(dict1))  

Varje ordbok har tillgång till items() metod. Den här funktionen returnerar nyckel-värdeparen i en ordbok som en lista över tupler. Vi kan sortera listan över tuplar genom att använda itemgetter() funktion för att dra det andra värdet av tupeln dvs värdet på nycklarna i ordboken.

När det är sorterat kan vi skapa en ordbok baserad på dessa värden:

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) 

Med mycket mindre ansträngning har vi en ordbok sorterad efter värderingar!

Som key argument accepterar vilken funktion som helst, vi kan använda lambda-funktioner för att returnera ordboksvärden så att de kan sorteras. Låt oss se hur.

Sortera ordbok med en lambdafunktion

Lambdafunktioner är anonyma, eller namnlösa, funktioner i Python. Vi kan använda lambda-funktioner för att få värdet av ett ordboksobjekt utan att behöva importera operator modul för itemgetter(). Om du vill lära dig mer om lambdas kan du läsa om dem i vår guide till Lambdafunktioner i Python.

Kolla in vår praktiska, praktiska guide för att lära dig Git, med bästa praxis, branschaccepterade standarder och medföljande fuskblad. Sluta googla Git-kommandon och faktiskt lära Det!

Låt oss sortera en ordbok efter värden med hjälp av en lambda-funktion i key argument av 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)  

Observera att metoderna vi har diskuterat hittills bara fungerar med Python 3.7 och senare. Låt oss se vad vi kan göra för tidigare versioner av Python.

Returnera en ny ordbok med sorterade värden

Efter att ha sorterat en ordbok efter värden, för att behålla en sorterad ordbok i Python-versioner före 3.7, måste du använda OrderedDict – finns i collections modul. Dessa objekt är ordböcker som håller ordningsföljden för insättning.

Här är ett exempel på sortering och användning 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)  

Slutsats

Denna handledning visade hur en ordbok kan sorteras utifrån dess värden. Vi sorterade först en ordbok med två för loopar. Vi förbättrade sedan vår sortering genom att använda sorted() fungera. Vi har också sett itemgetter() funktion från operator modul kan göra vår lösning mer kortfattad.

Slutligen anpassade vi vår lösning för att fungera på Python-versioner lägre än 3.7.

Variationer av sorted() funktion är de mest populära och tillförlitliga för att sortera en ordbok efter värden.

Tidsstämpel:

Mer från Stackabuse