Förstå sorterad funktion i Python: En enkel guide

By rik

En av Pythons mest tilltalande egenskaper är dess enkelhet. Det är smidigt att jobba med språket eftersom dess standardbibliotek tillhandahåller ett brett utbud av praktiska verktyg. Ett sådant verktyg är funktionen `sorted()`.

Denna funktion används för att ordna element i en följd (iterabel) på ett bestämt sätt. Utan den skulle man behöva skriva egen kod för att implementera sorteringsalgoritmer som Bubblesort eller Insättningssortering. Detta kan vara komplicerat, men Python erbjuder en enklare lösning, vilket vi kommer att undersöka i denna artikel.

Introduktion till funktionen `sorted()`

Funktionen `sorted()` är en funktion som sorterar iterabla objekt i Python. En iterabel är vilken samling data som helst som du kan gå igenom med en loop. Exempel på iterables är strängar, listor, tupler och mängder (sets). Dessa datatyper är ofta oordnade, och sortering placerar deras värden i en specifik följd. Att ha ordnade värden är användbart eftersom:

  • Sökning efter värden går snabbare och mer effektivt med hjälp av algoritmer som binärsökning. Binärsökning kräver dock att värdena är sorterade först.
  • Det underlättar presentation av data. Ibland vill användare se information ordnad, till exempel med det lägsta priset först eller det senaste inlägget överst. Detta skulle kräva ett sätt att sortera en lista med data.
  • Det underlättar statistisk analys, som att identifiera det vanligaste värdet i en datauppsättning. Det är enklare att utföra när värdena är ordnade.

Användningsguide för funktionen `sorted()`

Som tidigare nämnts fungerar funktionen `sorted()` med alla typer av iterables. Funktionen returnerar alltid en lista med de sorterade elementen. Det är viktigt att notera – även om inmatningen kan vara av vilken iterabel typ som helst, blir resultatet alltid en lista.

Syntax för funktionen `sorted()`

Funktionssignaturen för `sorted()` ser ut så här:

sorted(iterable, key=None, reverse=False)

Det enda obligatoriska argumentet är `iterable`, det objekt som ska sorteras.

Nästa argument är `key`. `key` är en funktion som används för att omvandla varje element i den iterabla samlingen till ett värde som används i sorteringsprocessen. Detta är praktiskt när du ska sortera en lista av ordböcker (dictionaries), vilket du kommer att se senare. Standardvärdet är `None`, vilket innebär att ingen funktion tillämpas om du inte anger det.

Det sista argumentet är `reverse`. När det är inställt på `True`, sorteras elementen i omvänd ordning.

I kommande avsnitt kommer jag att visa exempel på hur funktionen används.

Exempel på användning av `sorted()`

Lista med nummer

Det enklaste fallet är att sortera en lista med tal. Här är ett exempel:

# En lista med osorterade värden
numbers = [8, 4, 3, 9, 2, 0, 3]

# Sortering av talen
sorted_numbers = sorted(numbers)

# Utmatning av de sorterade värdena
print(sorted_numbers)

Utmatningen blir:

[0, 2, 3, 3, 4, 8, 9]

Som du ser har talen sorterats i stigande ordning. För att sortera dem i fallande ordning sätter du `reverse` till `True`. Alltså skulle rad 4 i exemplet vara:

sorted_numbers = sorted(numbers, reverse=True)

Resultatet av att köra det modifierade programmet skulle vara:

[9, 8, 4, 3, 3, 2, 0]

Lista med strängar

Funktionen `sorted()` kan hantera mer än bara tal. Du kan även sortera strängar. För att sortera strängar i en lista jämförs det första tecknet i varje sträng. Jämförelserna baseras på tecknens ASCII-värden. Till exempel kommer ”hej” före ”värld” eftersom ASCII-värdet för ’h’ (104) är lägre än ASCII-värdet för ’w’ (119).

Om en eller flera strängar börjar med samma tecken jämförs det andra, tredje och så vidare, tills en ordning hittas. Här är ett exempel där vi sorterar en lista med namn.

# Skapar en lista med namn
members_list = ['bob', 'dave', 'charlie', 'alice']

# Sorterar namnen
sorted_members_list = sorted(members_list)

# Skriver ut namnen
print(sorted_members_list)

Detta genererar följande resultat:

['alice', 'bob', 'charlie', 'dave']

Eftersom ASCII-värden används, beror strängarnas ordning på vilket tecken som kommer först i ASCII-tabellen. Till exempel kommer en versal före en gemen eftersom versaler kommer före gemener i ASCII. Här är en komplett ASCII-tabell som referens:

Källa: commons.wikimedia.org

Andra Iterables – Strängar, Tupler och Mängder

Som jag nämnde fungerar `sorted()` med alla sorters iterables. Samma regler gäller för hur värden i en iterabel sorteras. Här är ett exempel:

# Skriver ut en sorterad sträng
print(sorted("dijkstra"))

# Skriver ut en sorterad tuple
print(sorted((3, 4, 2, 1, 5, 0)))

# Skriver ut en sorterad mängd
print(sorted(set([4, 5, 5, 1, 3, 8, 9])))

Resultatet blir:

['a', 'd', 'i', 'j', 'k', 'r', 's', 't']
[0, 1, 2, 3, 4, 5]
[1, 3, 4, 5, 8, 9]

Som du ser är utmatningen i varje fall en lista.

Lista med Ordböcker

Du kan även använda `sorted()` för att sortera en lista med ordböcker. Dock är det lite mer komplicerat. Detta beror på att en ordbok har flera attribut, var och en lika giltig för jämförelse.

För att sortera ordböcker måste du ange en funktion som omvandlar en hel ordbok till ett enda värde som används för jämförelse. Denna funktion skickas till `sorted()` som argumentet `key`. Här är ett exempel för att illustrera:

people = [
        { 'name': 'Alice', 'age': 27 },
        { 'name': 'Bob', 'age':  23 },
        { 'name': 'Charlie', 'age': 25}
]

people_sorted_by_age = sorted(people, key=lambda person: person['age'])
print(people_sorted_by_age)

I detta exempel har vi tre personer representerade av ordboksobjekt. Varje objekt har attribut för namn och ålder. Vi vill sortera personerna efter ålder. När vi anropar `sorted()` skickar vi därför in en funktion som `key`-argumentet.

Denna funktion tar en persons ordboksobjekt och returnerar personens ålder. Returvärdet för nyckeln används för sorteringen. Alltså har hela ordboken sammanfattats till ett heltal som kan jämföras. För enkelhetens skull har jag använt en lambda-funktion för att definiera nyckelargumentet.

Körningen av koden ger följande utmatning:

[{'name': 'Bob', 'age': 23}, {'name': 'Charlie', 'age': 25}, {'name': 'Alice', 'age': 27}]

Användning av `key`-argumentet

`key`-argumentet är inte bara till för sortering av ordböcker. Du kan använda det med alla värden. Dess syfte är att tillhandahålla ett värde som kan användas för att sortera elementen. Här är exempel på användningsfall:

  • Sortera värden genom att definiera en nyckelfunktion som tar värdet och returnerar längden på värdet.
  • Sortera strängar i en lista utan att ta hänsyn till gemener eller versaler. Detta görs genom att omvandla varje sträng i listan till antingen gemener eller versaler. Detta kan åstadkommas genom att definiera en nyckelfunktion som tar en sträng och returnerar en version av strängen i gemener eller versaler.
  • Sortera element utifrån ett sammansatt värde som kombinerar värden från flera andra fält.

Tidskomplexitet för `sorted()`

Funktionen `sorted()` har en tidskomplexitet på O(n log n), där n är antalet element i den inmatade iterablen. Denna komplexitet uppstår eftersom funktionen använder algoritmen Timsort, en hybridalgoritm som är baserad på mergesort och insättningssortering.

Funktionens rymdkomplexitet är O(n), där n fortfarande är antalet element i inmatningen. Det beror på att en ny lista skapas och returneras.

`sorted()` vs. `sort()`

Ett annat alternativ för att sortera värden är metoden `sort()`. Det här avsnittet kommer att förklara de viktigaste skillnaderna mellan `sorted()` och `sort()`.

  • Metoden `sort()` ändrar den ursprungliga iterablen på plats, medan `sorted()` skapar en ny lista och returnerar den.
  • Eftersom ändringarna görs på plats, kräver `sort()` att inmatningen är en lista. Funktionen `sorted()` kan däremot ta vilken iterabel som helst, som sedan används för att skapa en ny lista som modifieras och returneras.

Avslutande Ord

I den här artikeln har vi diskuterat funktionen `sorted()`, vad den gör, hur den används, och de olika argument den tar. Vi gick igenom olika exempel på hur man använder funktionen, dess tidskomplexitet, och jämförde den med metoden `sort()`.

Nu kanske du vill läsa vår artikel om Pythons `sum()`-funktion.