Achtergrond: De sort() methode is ingebouwd in het list type sinds de eerste versies van Python, terwijl de sorted() functie in Python 2.4 is geïntroduceerd. Het sorteren van collecties is een van de meest voorkomende taken in programmeren, en Python biedt twee hoofdtools om dit te doen.
Probleem: Veel beginners verwarren sort() (de lijstmethode) en sorted() (de hogere orde functie). Er is geen begrip wanneer in-place sortering te gebruiken, welke objecten gesorteerd kunnen worden, hoe een willekeurige volgorde kan worden opgegeven via key/reverse, en welke valkuilen dit met zich meebrengt, vooral voor complexe gebruikersstructuren.
Oplossing:
Voorbeeld code:
numbers = [5, 2, 9, 1] numbers.sort() # numbers = [1, 2, 5, 9] words = ['aaa', 'ZZZ', 'bbb'] sorted_words = sorted(words, key=str.lower, reverse=True) # sorted_words = ['ZZZ', 'bbb', 'aaa'] # words blijft onveranderd
Belangrijke kenmerken:
Wat retourneert de variabele als je my_list = my_list.sort() doet?
Antwoord: my_list wordt None, omdat sort de lijst in-place sorteert en None retourneert. Dit is een veelvoorkomende bug: sort altijd in-place zonder toewijzing, of gebruik sorted als je een gesorteerd object wilt als een nieuwe lijst.
Voorbeeld code:
lst = [3, 1, 2] lst = lst.sort() # lst is nu None
Kun je een tuple of string sorteren met de sort() methode?
Antwoord: Nee, ongewijzigde objecten (tuple, str) hebben geen sort methode, maar je kunt sorted() gebruiken, dat een nieuwe gesorteerde lijst van de elementen retourneert.
Voorbeeld code:
tpl = (4, 2, 7) sorted_tpl = sorted(tpl) # sorted_tpl = [2, 4, 7]
Kun je een lijst met elementen van verschillende types sorteren?
Antwoord: In Python 3 veroorzaakt het sorteren van verschillende onvergelijkbare types (bijvoorbeeld int en str) een TypeError. In Python 2 was er een specifieke volgorde, nu moet je expliciet een key functie opgeven om alle waarden in een vergelijkbare vorm te brengen.
Negatieve casus
Een programmeur deed my_list = my_list.sort(), waarna hij de toegang tot de oorspronkelijke lijst verloor, omdat de variabele de waarde None kreeg.
Voordelen:
Nadelen:
Positieve casus
Gebruikten het zorgvuldig sorted() om een nieuwe versie te verkrijgen zonder het origineel te wijzigen, of pasten correct sort toe zonder toewijzing te doen.
Voordelen:
Nadelen: