Soms is het logisch of vanzelfsprekend dat een lijst gesorteerd moet zijn. Soms is het niet van belang. Bijvoorbeeld een lijst met de studenten die mondeling examen moeten afleggen. Hierbij is de volgorde belangrijk zodanig je weet wie eerst komt en wie tweede, … Een lijst met alle fruitsoorten die een winkel verkoopt heeft niet noodzakelijk een volgorde nodig.

Echter doordat oefeningen in dodona op verschillende manieren kunnen worden gemaakt en daardoor de volgorden van lijsten vaak niet voor iedereen gelijk is, wordt er regelmatiger dan gewoonlijk gevraagd om te sorteren. Daarom hier een expliciet stukje theorie daaromtrent.

.sort()

sort() sorteert de elementen van de list, van laag naar hoog. Als de elementen strings zijn, betreft het een alfabetische sortering. Als de elementen getallen zijn, betreft het een numerieke sortering. Als de elementen gemixt zijn, volgt een runtime error, tenzij bepaalde extra argumenten zijn meegegeven.

fruitlist = ["appel", "aardbei", "banaan", "framboos",
"kers", "banaan", "doerian", "mango"]
fruitlist.sort()
print( fruitlist )
numlist = [314 , 315, 642, 246, 129, 999]
numlist.sort()
print( numlist )

Om van hoog naar laag te sorteren, kun je een argument reverse=<boolean> meegeven.

fruitlist = ["appel", "aardbei", "banaan", "framboos", "kers", "banaan", "doerian", "aalbes"]
fruitlist.sort( reverse=True )
print( fruitlist )

Een ander argument dat je sort() kunt meegeven is een “key” (Engels voor sleutel). Je geeft dit argument mee volgens de syntax <list>.sort( key=<key> ), waarbij <key> een functie is die één element meekrijgt (namelijk het element dat gesorteerd moet worden) en die een waarde retourneert die als sorteringssleutel gebruikt moet worden. Een typische toepassing van het key argument is als je een list van strings wilt sorteren, waarbij je de strings “case-insensitive” (dat wil zeggen zonder verschil te maken tussen hoofd- en kleine letters) wilt sorteren. Dus als key wil je de waarde van het element volledig als kleine letters gebruiken. Dat kun je doen door als key functie str.lower() mee te geven. Je roept dan de sort() methode aan als in het volgende voorbeeld:

fruitlist = ["appel", "Aardbei", "banaan", "framboos",
"KERS", "banaana", "doerian", "mango"]
fruitlist.sort()
print( fruitlist )
fruitlist.sort( key=str.lower ) # case -insensitive sort
print(fruitlist)

Merk op dat je bij het key argument geen haakjes achter de functie naam zet. Dit is namelijk geen functie-aanroep, het is een argument dat Python vertelt welke functie gebruikt moet worden om de sorteringssleutel te genereren. Je kunt ook je eigen functies gebruiken als key. Bijvoorbeeld, in de volgende code wordt numlist gesorteerd met de cijfers van de drie-cijferige getallen in omgekeerde volgorde:

def keercijfersom( item ):
return (item%10) *100 + (int(item/10) %10) *10 + int(item/100)
numlist = [314 , 315, 642, 246, 129, 999]
numlist.sort( key=keercijfersom )
print( numlist )

Hier is een ander voorbeeld, waarbij een list van strings gesorteerd wordt op string lengte als eerste (korte strings vóór lange strings), en alleen bij gelijke lengte op alfabetische volgorde:

def len_alfabetisch( element ):
return len( element ), element
fruitlist = ["appel", "aardbei", "banaan", "framboos",
"kers", "banaan", "doerian", "mango"]
fruitlist.sort( key=len_alfabetisch )
print( fruitlist )

Merk op dat de en_alfabetisch() functie een tuple retourneert. Zoals in tuples werd uitgelegd, als je twee tuples vergelijkt worden eerst de eerste elementen van de tuples vergeleken, en alleen als die gelijk zijn worden de tweede elementen vergeleken. Je kunt deze kennis gebruiken om een key-functie te bouwen die een lijst met verschillende datatypes sorteert, bijvoorbeeld, een lijst met zowel strings als getallen. Je laat de keyfunctie gewoon een tuple retourneren waarvan het eerste item het soort element aangeeft, en het tweede het element zelf.

def mix_key( element ):
if isinstance( element , str ):
return 1, element
return 0, element
mixedlist = ["appel", 0, "aardbei", 5, "banaan", 2, \
"moerbei", 9, "kers", "banaan", 7, 7, 6, "mango"]
mixedlist.sort( key=mix_key )
print( mixedlist )

Voor meer informatie ga je naar hoofdstuk 12.4.9 sort() in het boek.