Hur man sorterar en Python-ordbok efter nyckel eller värde

I den här handledningen kommer du att lära dig hur du sorterar en Python-ordbok efter dess nyckel eller värde.

När du arbetar med en ordbok i Python, finns det tillfällen då du behöver sortera dess innehåll – efter nyckel eller värde. Eftersom en Python-ordbok är en nyckel-värde-mappning, skapar du en ny ordbok som har nycklarna eller värdena sorterade efter behov.

I den här handledningen börjar vi med att granska grunderna i Python-ordboken. Vi lär oss sedan att skapa en ny ordbok där innehållet sorteras efter nyckel eller värde, efter behov.

Python Dictionary Basics, Revisited

Vad är en Python Dictionary?

Dictionary är en inbyggd datastruktur i Python. Den lagrar föremål som nyckel-värdepar. Du kan använda knapparna för att slå upp motsvarande värden. Eftersom nycklarna unikt identifierar värdena bör det inte förekomma någon upprepning av nycklar.

py_dict = {"Python":"cool!","Learn":True}
py_dict["Python"]
# Output: cool!

py_dict["Learn"]
# Output: True

Funktionellt liknar en ordbok en hashkarta. Därför är det inte nödvändigtvis en ordnad datastruktur. Du kan komma åt innehållet i en ordbok i valfri ordning, så länge du känner till nycklarna.

Ordning av artiklar i en ordbok

I tidigare versioner av Python var du tvungen att använda en OrderedDict för att bevara nycklarnas ordning. Men från Python 3.7 kan du komma åt objekten i samma ordning som du lägger till dem i ordboken.

Nu när du har lärt dig grunderna i Python-ordböcker, låt oss lära oss hur man skapar sorterade kopior av ordboken.

⚙️ Obs: Du måste ha Python 3.7 eller senare för att koden i denna handledning ska fungera som förväntat. Du kan ladda ner senaste versionen av Pythoneller kör exemplen i adminvista.com Online Python Editor.

Hur man sorterar en Python-ordbok efter nyckel

Titta på följande bild av dessertmenyn på ett café. Det finns två kolumner som motsvarar objekten på menyn och deras respektive priser.

Du kan representera detta i form av en Python-ordbok genom att samla in namnen på objekt som nycklar och deras priser som värden.

Låt oss gå vidare och skapa ordboksefterrätterna, som visas nedan.

desserts = {
    "Ice cream":10,
    "Brownies":12,
    "Cheesecake":3,
    "Swiss roll":5,
    "Cookies":4,
    "Cup cake":2
}

Låt oss sedan skapa en ordbok sorterade_efterrätter, där desserterna är ordnade i alfabetisk ordning. I den ursprungliga dessertordboken är namnen på desserterna nycklarna. Så du bör sortera dessa nycklar i alfabetisk ordning för att skapa en ny ordbok.

Hur man kommer åt nycklarna till en Python-ordbok

För att göra detta ska vi först hämta nycklarna till ordboken och sedan sortera dem i alfabetisk ordning.

I Python kan du använda den inbyggda ordboksmetoden .keys() för att få en lista över alla nycklar i ordboken.

Låt oss anropa metoden .keys() i dessertordboken för att hämta nycklarna, som visas nedan.

keys = desserts.keys()
print(keys)

#Output
['Ice cream', 'Brownies', 'Cheesecake', 'Swiss roll', 'Cookies', 
'Cup cake']

Att anropa Pythons inbyggda sorted() funktion med en lista som argument returnerar en ny sorterad lista.

Låt oss sedan kalla funktionen sorted() med listnycklarna som argument och lagra den sorterade listan i variabeln sorted_keys.

sorted_keys = sorted(keys)
print(sorted_keys)

# Output
['Brownies', 'Cheesecake', 'Cookies', 'Cup cake', 'Ice cream', 'Swiss roll']

Nu när vi har nycklarna sorterade i alfabetisk ordning kan vi slå upp de värden som motsvarar nycklarna i sorted_keys från dessertordboken, som visas nedan.

sorted_desserts = {}
for key in sorted_keys:
  sorted_desserts[key] = desserts[key]

print(sorted_desserts)

# Output
{'Brownies': 12, 'Cheesecake': 3, 'Cookies': 4, 'Cup cake': 2, 
'Ice cream': 10, 'Swiss roll': 5}

Låt oss expandera på ovanstående kodblock:

  • Initiera sorted_desserts för att vara en tom Python-ordbok.
  • Gå igenom tangentlistan sorted_keys.
  • För varje nyckel i sorted_keys, lägg till en post till sortered_desserts genom att slå upp motsvarande värde i dessertordboken.

Att använda for-slingan på det här sättet anses vara omfattande. I Python finns det ett mer kortfattat alternativ med hjälp av ordboksförståelse.

Ordboksförståelse i Python

Python stöder användningen av ordboksförståelse, liknande listförståelse. Ordboksförståelse låter dig skapa en ny Python-ordbok med bara en rad kod.

▶️ Här är den allmänna konstruktionen för att använda ordboksförståelse i Python.

# 1. when you have both keys and values in two lists: list1, list2
new_dict = {key:value for key,value in zip(list1,list2)}

# 2. when you have the keys, and can look up the values
new_dict = {key:value for key in <iterable>}

Låt oss använda den andra konstruktionen i cellen ovan: new_dict = {key:value for key in } för att skapa en sorterad_efterrättsordbok.

I det här exemplet:

  • iterable: listan sorted_keys
  • key: nyckeln som vi kommer åt genom att loopa genom sorted_keys
  • värde: slå upp värdet som motsvarar nyckeln från dessertordboken, desserter[key]

Tillsammans har vi uttrycket för ordboksförståelse, som visas nedan.

sorted_desserts = {key:desserts[key] for key in sorted_keys}
print(sorted_desserts)

{'Brownies': 12, 'Cheesecake': 3, 'Cookies': 4, 'Cup cake': 2, 
'Ice cream': 10, 'Swiss roll': 5}

Från ovanstående utdata är desserterna ordnade i alfabetisk ordning i ordboken sorterade_efterrätter.

Hur man sorterar en Python-ordbok efter värde

Därefter kommer vi att lära oss hur man sorterar en Python-ordbok efter dess värden.

I dessertlexikonet motsvarar värdena priserna på desserterna. Du kanske vill sortera ordlistan efter priser, antingen i ökande eller minskande ordning.

▶️ Du kan använda den inbyggda ordboksmetoden .items() för att få alla nyckel-värdepar. Varje tuppel är ett nyckel-värdepar.

desserts.items()

dict_items([('Ice cream', 10), ('Brownies', 12), ('Cheesecake', 3), 
('Swiss roll', 5), ('Cookies', 4), ('Cup cake', 2)])

Var och en av föremålen är en tupel i sig. Så du kan också indexera i varje nyckel-värdepar för att komma åt nycklarna och värdena individuellt.

dict_items = desserts.items()
for item in dict_items:
  print(f"key:{item[0]},value:{item[1]}")

# Output
key:Ice cream,value:10
key:Brownies,value:12
key:Cheesecake,value:3
key:Swiss roll,value:5
key:Cookies,value:4
key:Cup cake,value:2

Eftersom vi skulle vilja sortera efter värden använder vi metoden ovan för att få värdet vid index 1 i nyckel-värdeparet.

Hur man sorterar värdena för en Python-ordbok i ökande ordning

Den här gången kommer vi att använda funktionen sorted() tillsammans med den valfria nyckelparametern. nyckel kan vara vilken Python-funktion som helst, en inbyggd funktion, en användardefinierad funktion eller till och med en lambda funktion.

Obs: lambda args: expression är syntaxen för att definiera lambda-funktioner i Python.

I det här exemplet med att sortera efterrätter efter pris har vi tillgång till ordboksartiklar (nyckel-värdepar). Vi ställer in nyckel = lambda artikel:artikel[1] eftersom vi skulle vilja sortera efter värdet (priset).

Eftersom sorted()-funktionen returnerar en lista som standard, bör du uttryckligen casta den till en dict, som visas nedan.

sorted_desserts = dict(sorted(desserts.items(), key=lambda item:item[1]))
print(sorted_desserts)

{'Cup cake': 2, 'Cheesecake': 3, 'Cookies': 4, 'Swiss roll': 5, 
'Ice cream': 10, 'Brownies': 12}

Du kan också skriva om med ordboksförståelsesom diskuterats tidigare.

sorted_desserts = {key:value for key, value in sorted(desserts.items(), 
key=lambda item:item[1])}

print(sorted_desserts)

# Output
{'Cup cake': 2, 'Cheesecake': 3, 'Cookies': 4, 'Swiss roll': 5, 
'Ice cream': 10, 'Brownies': 12}

I sorted_desserts är Cup Cake prissatt till $2 det första föremålet och Brownies prissatt till $12 är det sista föremålet.

Hur man sorterar värdena för en Python-ordbok i fallande ordning

Om du vill sortera priserna i fallande ordning kan du ställa in den valfria reverse-parametern till True, som förklaras nedan.

sorted_desserts = dict(sorted(desserts.items(), key=lambda item:item[1], 
reverse=True))
print(sorted_desserts)

# Output
{'Brownies': 12, 'Ice cream': 10, 'Swiss roll': 5, 'Cookies': 4, 
'Cheesecake': 3, 'Cup cake': 2}

Nu har sorted_desserts sorterats i fallande prisordning, med början på den dyraste efterrätten Brownies som kostar $12.

Avslutning 👩🏽‍💻

Låt oss snabbt sammanfatta allt vi har lärt oss i denna handledning.

  • En Python-ordbok lagrar data i nyckel-värdepar; nycklarna ska alla vara unika.
  • I processen att sortera en ordbok efter nyckel eller värde skapar vi en ny ordbok som sorteras efter behov.
  • Du kan använda de inbyggda ordboksmetoderna .keys() och .items() för att hämta alla nycklar respektive nyckel-värdepar.
  • Du kan använda funktionen sorted() tillsammans med den valfria parameternyckeln och reversera för att uppnå önskad sortering.

Nu när du har lärt dig att sortera en Python-ordbok, lär dig att sortera Python-listor. Lycka till med kodningen!🎉