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

By rik

Utforska Sortering av Python-ordböcker: En Djupdykning

I den här guiden kommer vi att undersöka hur du kan ordna en Python-ordbok, antingen baserat på dess nycklar eller värden.

När man arbetar med ordböcker i Python, dyker det ofta upp situationer där man behöver organisera innehållet – antingen alfabetiskt efter nycklar eller numeriskt efter värden. Eftersom en Python-ordbok fungerar som en mappning mellan nycklar och värden, åstadkommer vi detta genom att skapa en ny ordbok med de sorterade nycklarna eller värdena.

Vi börjar med att repetera de grundläggande principerna för Python-ordböcker. Sedan kommer vi att lära oss hur man genererar en ny ordbok där innehållet är sorterat antingen efter nyckel eller värde, beroende på behov.

Python Ordboks Grunder, Återbesökta

Vad är en Python Ordbok?

En ordbok är en inbyggd datastruktur i Python som lagrar information i form av nyckel-värdepar. Du använder nycklarna för att snabbt hitta de tillhörande värdena. Eftersom varje nyckel unikt identifierar ett värde, får det inte finnas dubbletter av nycklar.

 py_dict = {"Python":"häftigt!","Lär":True}
 py_dict["Python"]
 # Utdata: häftigt!

 py_dict["Lär"]
 # Utdata: True
 

Funktionsmässigt liknar en ordbok en hashtabell. Det är därför inte nödvändigtvis en ordnad datastruktur. Du kan komma åt innehållet i vilken ordning som helst, så länge du har rätt nycklar.

Ordning på element i en Ordbok

I äldre versioner av Python var det nödvändigt att använda OrderedDict för att bevara nycklarnas ordning. Men från och med Python 3.7 kan du komma åt elementen i samma ordning som de lades till i ordboken.

Nu när du har en uppfriskning av grunderna i Python-ordböcker, låt oss dyka in i hur man skapar sorterade kopior av ordboken.

⚙️ **Notering:** Du behöver Python 3.7 eller senare för att koden i den här guiden ska fungera som förväntat. Du kan ladda ner den senaste versionen av Python eller testa exemplen med en Online Python Editor.

Sortera en Python Ordbok efter Nyckel

Tänk dig en meny med efterrätter på ett kafé. Den består av två kolumner: namnen på efterrätterna och deras respektive priser.

Detta kan representeras som en Python-ordbok genom att använda namnen på efterrätterna som nycklar och deras priser som värden.

Låt oss skapa en ordbok, `efterrätter`, som visas nedan.

 efterrätter = {
     "Glass":10,
     "Brownies":12,
     "Cheesecake":3,
     "Schweizisk rulltårta":5,
     "Kakor":4,
     "Muffins":2
 }
 

Nu ska vi generera en ny ordbok, `sorterade_efterrätter`, där efterrätterna är sorterade i alfabetisk ordning. I den ursprungliga `efterrätter` ordboken är namnen på efterrätterna nycklarna. Därför ska vi sortera dessa nycklar alfabetiskt för att skapa vår nya ordbok.

Hur man Åtkomst Nycklarna i en Python Ordbok

För att göra detta måste vi först hämta nycklarna från ordboken och sedan sortera dem alfabetiskt.

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

Låt oss anropa `.keys()` metoden på `efterrätter` ordboken för att hämta nycklarna.

 nycklar = efterrätter.keys()
 print(nycklar)

 # Utdata
 ['Glass', 'Brownies', 'Cheesecake', 'Schweizisk rulltårta', 'Kakor', 
 'Muffins']
 

Genom att anropa Pythons inbyggda `sorted()` funktion med en lista som argument returneras en ny, sorterad lista.

Låt oss nu använda `sorted()` funktionen med listan av nycklar som argument och lagra den sorterade listan i variabeln `sorterade_nycklar`.

 sorterade_nycklar = sorted(nycklar)
 print(sorterade_nycklar)

 # Utdata
 ['Brownies', 'Cheesecake', 'Glass', 'Kakor', 'Muffins', 'Schweizisk rulltårta']
 

Med nycklarna sorterade alfabetiskt, kan vi nu använda dem för att leta upp deras motsvarande värden från `efterrätter` ordboken, som visas nedan.

 sorterade_efterrätter = {}
 for nyckel in sorterade_nycklar:
   sorterade_efterrätter[nyckel] = efterrätter[nyckel]

 print(sorterade_efterrätter)

 # Utdata
 {'Brownies': 12, 'Cheesecake': 3, 'Glass': 10, 'Kakor': 4, 'Muffins': 2, 
 'Schweizisk rulltårta': 5}
 

Låt oss bryta ner koden ovan:

  • Vi initierar `sorterade_efterrätter` som en tom Python-ordbok.
  • Vi itererar över listan med nycklar, `sorterade_nycklar`.
  • För varje nyckel i `sorterade_nycklar`, lägger vi till ett nytt element i `sorterade_efterrätter` genom att hämta det motsvarande värdet från `efterrätter` ordboken.

Den här metoden med en `for`-loop anses vara ganska utförlig. I Python finns det en mer koncis metod som använder ordboksförståelse.

Ordboksförståelse i Python

Python stöder ordboksförståelse, på samma sätt som listförståelse. Med ordboksförståelse kan man skapa en ny Python-ordbok med bara en rad kod.

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

 # 1. när du har både nycklar och värden i två listor: lista1, lista2
 ny_ordbok = {nyckel:värde for nyckel,värde in zip(lista1,lista2)}

 # 2. när du har nycklarna, och kan hämta värdena
 ny_ordbok = {nyckel:värde for nyckel in <iterable>}
 

Låt oss använda den andra konstruktionen i cellen ovan: `ny_ordbok = {nyckel:värde for nyckel in <iterable>}` för att skapa ordboken `sorterade_efterrätter`.

I det här exemplet:

  • `iterable`: listan `sorterade_nycklar`
  • `nyckel`: nyckeln som vi får genom att loopa genom `sorterade_nycklar`
  • `värde`: hämtar värdet som motsvarar nyckeln från `efterrätter` ordboken, `efterrätter[nyckel]`

Sätter vi ihop detta, får vi ordboksförståelsen som visas nedan.

 sorterade_efterrätter = {nyckel:efterrätter[nyckel] for nyckel in sorterade_nycklar}
 print(sorterade_efterrätter)

 {'Brownies': 12, 'Cheesecake': 3, 'Glass': 10, 'Kakor': 4, 'Muffins': 2, 
 'Schweizisk rulltårta': 5}
 

Från utskriften ser vi att efterrätterna är ordnade i alfabetisk ordning i ordboken `sorterade_efterrätter`.

Sortera en Python Ordbok efter Värde

Nu ska vi lära oss hur man sorterar en Python-ordbok baserat på dess värden.

I ordboken `efterrätter` representerar värdena priserna på efterrätterna. Du kanske vill sortera ordboken efter priser, antingen i stigande eller fallande ordning.

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

 efterrätter.items()

 dict_items([('Glass', 10), ('Brownies', 12), ('Cheesecake', 3), 
 ('Schweizisk rulltårta', 5), ('Kakor', 4), ('Muffins', 2)])
 

Varje element är en tuppel i sig. Det innebär att du kan indexera inuti varje nyckel-värdepar för att nå nycklarna och värdena separat.

 dict_items = efterrätter.items()
 for element in dict_items:
   print(f"nyckel:{element[0]},värde:{element[1]}")

 # Utdata
 nyckel:Glass,värde:10
 nyckel:Brownies,värde:12
 nyckel:Cheesecake,värde:3
 nyckel:Schweizisk rulltårta,värde:5
 nyckel:Kakor,värde:4
 nyckel:Muffins,värde:2
 

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

Sortera Värdena i en Python Ordbok i Stigande Ordning

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

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

I detta fall med att sortera efterrätter efter pris, har vi tillgång till ordbokens element (nyckel-värdepar). Vi sätter `key = lambda element:element[1]` eftersom vi vill sortera efter värdet (priset).

Eftersom `sorted()` funktionen som standard returnerar en lista, måste vi explicit omvandla den till en ordbok, som visas nedan.

 sorterade_efterrätter = dict(sorted(efterrätter.items(), key=lambda element:element[1]))
 print(sorterade_efterrätter)

 {'Muffins': 2, 'Cheesecake': 3, 'Kakor': 4, 'Schweizisk rulltårta': 5, 
 'Glass': 10, 'Brownies': 12}
 

Vi kan också skriva om koden med ordboksförståelse, som vi diskuterade tidigare.

 sorterade_efterrätter = {nyckel:värde for nyckel, värde in sorted(efterrätter.items(), 
 key=lambda element:element[1])}

 print(sorterade_efterrätter)

 # Utdata
 {'Muffins': 2, 'Cheesecake': 3, 'Kakor': 4, 'Schweizisk rulltårta': 5, 
 'Glass': 10, 'Brownies': 12}
 

I `sorterade_efterrätter` är Muffins, som kostar 2 kronor, det första elementet, och Brownies, som kostar 12 kronor, det sista.

Sortera Värdena i en Python Ordbok i Fallande Ordning

För att sortera priserna i fallande ordning, kan vi sätta den valfria parametern `reverse` till `True`, som förklaras nedan.

 sorterade_efterrätter = dict(sorted(efterrätter.items(), key=lambda element:element[1], 
 reverse=True))
 print(sorterade_efterrätter)

 # Utdata
 {'Brownies': 12, 'Glass': 10, 'Schweizisk rulltårta': 5, 'Kakor': 4, 
 'Cheesecake': 3, 'Muffins': 2}
 

Nu är `sorterade_efterrätter` sorterad efter fallande pris, med den dyraste efterrätten, Brownies, som kostar 12 kronor, först.

Avslutning 👩🏽‍💻

Låt oss snabbt sammanfatta vad vi har gått igenom i den här guiden.

  • En Python-ordbok lagrar data i nyckel-värdepar; alla nycklar måste vara unika.
  • För att sortera en ordbok efter nyckel eller värde skapar vi en ny ordbok som är sorterad 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 `sorted()` funktionen tillsammans med den valfria parametern `key` och `reverse` för att uppnå önskad sortering.

Nu när du har lärt dig hur man sorterar en Python-ordbok, kan du lära dig hur man sorterar Python-listor. Lycka till med kodningen! 🎉