Hur man sorterar listor i Python

By rik

Denna artikel ger dig kunskap om hur du ordnar elementen i en lista i programmeringsspråket Python.

I Python finns två huvudsakliga sätt att åstadkomma sortering. Metoden sort() modifierar den ursprungliga listan, medan funktionen sorted() skapar en ny, sorterad lista utan att påverka den ursprungliga.

Denna handledning kommer att guida dig genom följande:

  • Syntaxen för både sort()-metoden och sorted()-funktionen.
  • Praktiska exempel på hur du sorterar listor i stigande och fallande ordning.
  • Anpassning av sortering med hjälp av nyckelparametern.
  • De viktigaste skillnaderna mellan sort() och sorted().

Låt oss börja utforska! 👩🏽‍💻

Syntax för Pythons sort()-metod

sort()-metoden appliceras direkt på en lista och ordnar om elementen i den ursprungliga listan.

Grundläggande syntax för sort()-metoden:

<list>.sort(reverse=True | False, key=<func>)

Låt oss bryta ner denna syntax:

  • <list> är den lista du vill sortera.
  • reverse är en valfri parameter som kan anta värdet True eller False. Om reverse=False (standard), sorteras listan i stigande ordning. Med reverse=True sorteras listan i fallande ordning.
  • key är en annan valfri parameter som tar en funktion som argument. Denna funktion används för att anpassa sorteringskriterierna.

Nu går vi vidare till konkreta exempel.

Sortera en lista i stigande ordning

Vi börjar med en lista av tal. För att sortera denna lista i stigande ordning, anropa metoden sort() på listan.

▶ Prova följande kod:


nums = [25, 13, 6, 17, 9]
nums.sort()
print(nums)

Utdata:

[6, 9, 13, 17, 25]

Listan är nu sorterad i stigande ordning och den ursprungliga listan har ändrats. Detta är vad som kallas ”på plats”-sortering.

Sortera en lista i fallande ordning

För att ordna listan i fallande ordning, sätter du reverse-parametern till True, som visas nedan.


nums = [25, 13, 6, 17, 9]
nums.sort(reverse=True)
print(nums)

Utdata:

[25, 17, 13, 9, 6]

Listan är nu ordnad från största till minsta tal.

Använda key-parametern för anpassad sortering

Nu ska vi undersöka hur key-parametern kan användas för att anpassa sorteringen.

Låt oss definiera en funktion mod5(x) som returnerar resten när x delas med 5.


def mod5(x):
  return x % 5

Vi kan nu använda denna funktion som key.

Kör följande kod:


nums = [25, 13, 6, 17, 9]
nums.sort(key=mod5)
print(nums)

Utdata:

[25, 6, 17, 13, 9]

Observera att sorteringen inte längre följer den numeriska ordningen. Istället sorteras listan baserat på resultatet av funktionen mod5.

  • Tal som ger den minsta resten när de delas med 5 placeras först.
  • Tal som ger den största resten hamnar sist.

För att tydliggöra detta, se följande utskrift:


nums = [25, 13, 6, 17, 9]

for num in nums:
  print(f"{num} ger resten {num%5} när den delas med 5")

Utskrift:


25 ger resten 0 när den delas med 5
13 ger resten 3 när den delas med 5
6 ger resten 1 när den delas med 5
17 ger resten 2 när den delas med 5
9 ger resten 4 när den delas med 5

25 delat med 5 ger resten 0, vilket är anledningen till att det är det första elementet. 6 ger resten 1 och kommer som nästa element, och så vidare. 9 ger resten 4 och är det sista elementet i listan.

I stället för att definiera en funktion, kan man använda lambda-funktioner. En lambda-funktion är en kort, anonym funktion.

Låt oss nu skriva om ovanstående sortering med en lambda-funktion:


nums = [25, 13, 6, 17, 9]
nums.sort(key=lambda x: x % 5)
print(nums)

Utdata:

[25, 6, 17, 13, 9]

Hittills har vi hanterat sortering av numeriska listor. Nu ska vi titta på hur man sorterar listor med strängar.

Sortera en lista med strängar i alfabetisk ordning

I det här avsnittet ska vi lära oss hur man sorterar en lista med strängar med exempel inspirerade av Harry Potter. ✨

I vårt exempel representerar listan students eleverna på Hogwarts och vi vill sortera dem i alfabetisk ordning.

När man sorterar en lista med strängar är standardsorteringen alfabetisk.


students = ["Harry", "Ron", "Hermione", "Draco", "Cedric"]

Låt oss skriva ut den sorterade listan:


students.sort()
print(students)

Utdata:


['Cedric', 'Draco', 'Harry', 'Hermione', 'Ron']

Sortera i omvänd alfabetisk ordning

För att sortera i omvänd alfabetisk ordning, ange reverse=True:


students.sort(reverse=True)
print(students)

Utdata:


['Ron', 'Hermione', 'Harry', 'Draco', 'Cedric']

Anpassa sortering med key-parametern

Nu ska vi använda key-parametern för att ytterligare anpassa sorteringen.

Betrakta följande lista med dictionaries, houses:


houses = [
            {1: "Draco", "house": "Slytherin"},
            {2: "Harry", "house": "Gryffindor"},
            {3: "Cedric", "house": "Hufflepuff"}
         ]

Listan houses innehåller dictionaries med information om elever och deras respektive hus. Vi vill nu sortera listan baserat på husens namn.

Vi behöver använda key-parametern för att specificera vilket fält i varje dictionary som ska användas för sortering.

Låt oss definiera en funktion returnHouse() som returnerar husnamnet för en given elev.


def returnHouse(student):
  return student["house"]

Vi kan nu använda sort()-metoden:


houses.sort(key=returnHouse)

Listan är nu sorterad efter husens namn, inte efter elevernas namn.


print(houses)

Utdata:


[{2: 'Harry', 'house': 'Gryffindor'},
{3: 'Cedric', 'house': 'Hufflepuff'},
{1: 'Draco', 'house': 'Slytherin'}]

Vi kan även använda en lambda-funktion för att uppnå samma resultat. Lambda-funktionen hämtar husnamnet från varje dictionary.

▶ Kör följande kod:


houses.sort(key=lambda student: student["house"])
print(houses)

Utdata:


[{2: 'Harry', 'house': 'Gryffindor'},
{3: 'Cedric', 'house': 'Hufflepuff'},
{1: 'Draco', 'house': 'Slytherin'}]

Hittills har vi använt metoden sort() som ändrar den ursprungliga listan. Men vad händer om vi vill behålla den ursprungliga listan och skapa en sorterad kopia?

I Python kan vi då använda funktionen sorted().

Syntax för Pythons sorted()-funktion

Funktionen sorted() tar en lista (eller en annan samling) som argument och returnerar en ny, sorterad lista. Den ursprungliga listan förblir oförändrad.

Syntaxen för sorted()-funktionen:

<sorted_copy> = sorted(<list>, reverse=True | False, key=<func>)

Syntaxen är snarlik sort()-metoden:

  • <list> är den lista som ska sorteras. Denna parameter är obligatorisk.
  • reverse och key är valfria parametrar, med samma funktionalitet som för metoden sort().

Till skillnad från sort()-metoden, som endast fungerar på listor, kan sorted() användas för att sortera många typer av samlingar, som listor, strängar och dictionaries.

Använda sorted()-funktionen

#1. Här använder vi sorted() på en lista med tal.

Vi anropar funktionen sorted() med nums som argument och tilldelar resultatet till sorted_nums1.


nums = [25, 13, 6, 17, 9]
sorted_nums1 = sorted(nums)
print(sorted_nums1)

Utdata:

[6, 9, 13, 17, 25]

Listan har nu sorterats i stigande ordning.

Den ursprungliga listan är oförändrad eftersom sorted() returnerar en ny lista.


print(nums)

Utdata:

[25, 13, 6, 17, 9]

#2. Vi använder nu reverse=True.

Listan sorted_nums2 blir sorterad i fallande ordning.


sorted_nums2 = sorted(nums, reverse=True)
print(sorted_nums2)

Utdata:

[25, 17, 13, 9, 6]

#3. Nu sorterar vi en lista med strängar.

Listan sorteras i alfabetisk ordning och den ursprungliga listan ändras inte.


fruits = ['pears', 'strawberry', 'apple', 'pineapple', 'blueberry']
sorted_fr1 = sorted(fruits)
print(sorted_fr1)

Utdata:


['apple', 'blueberry', 'pears', 'pineapple', 'strawberry']

#4. Vi anpassar sorteringen med key-parametern. Vi sorterar listan baserat på längden på strängarna.

Funktionen len() returnerar längden av en samling.

Den kortaste strängen kommer först och den längsta sist.


fruits = ['pear', 'strawberry', 'apple', 'pineapple', 'blueberry']
sorted_fr2 = sorted(fruits, key=len)
print(sorted_fr2)

Utdata:


['pear', 'apple', 'pineapple', 'blueberry', 'strawberry']

pear är den kortaste strängen och strawberry den längsta.

sort()-metod vs. sorted()-funktion

Här sammanfattar vi skillnaderna mellan sort() och sorted():

Python .sort() Metod Python sorted() Funktion
Sorterar listan på plats (ändrar originalet) Returnerar en ny sorterad lista
Fungerar endast med listor Fungerar med många samlingar (listor, strängar, osv.)
Har returtypen None Returnerar en sorterad kopia av det itererbara

Sammanfattning 👩‍🏫

Jag hoppas att denna handledning var till hjälp.

Låt oss snabbt gå igenom det vi har lärt oss:

  • Använd list.sort(reverse=True | False, key=<func>) för att sortera en lista på plats.
  • Använd sorted(list, reverse=True | False, key=<func>) för att få en ny sorterad lista.

Nu när du vet hur man sorterar listor, kan du utforska listomfattning i Python. Du kan även lära dig mer om hur du hanterar filer eller jobbar med JSON-filer i Python.

Du kan experimentera med exemplen i adminvista.com Online Python Compiler.