Python heeft een groot aantal methodes die lists wijzigen of informatie uit lists halen. Je hoeft geen module te importeren om ze te gebruiken. Omdat het methodes betreft, gebruik je de syntax <list>.<methode>().

Belangrijk

Lists zijn veranderbaar en deze methodes veranderen vaak de list waarop ze werken! Dit is niet wat je gewend bent met string methodes, waarbij de methodes een nieuwe string maken en die retourneren, zonder de originele string aan te passen. De meeste list methodes hebben daarentegen een onomkeerbaar effect op de list waarop ze werken. Meestal hebben ze ook geen retourwaarde, en die heb je ook niet nodig, omdat het doel van de methodes is de list te wijzigen.

append()

append() plakt een nieuw element aan het einde van een list. Je roept de methode aan met het nieuwe element als argument.

fruitlist = ["appel", "banaan", "kers", "doerian"]
print( fruitlist )
fruitlist.append( "mango" )
print( fruitlist )

Zoals hierboven is beschreven, kun je in plaats van de append() methode een element aan een list toevoegen via de \(+\) operator, en het resultaat weer toekennen aan de variabele die de list bevat. De append() methode is echter leesbaarder. <list>.append(<element>) is equivalent met <list>[len(<list>):] = [<element>], of <list> += [<element>].

extend()

extend() maakt een list langer door alle elementen van een tweede list aan het einde te van de eerste list toe te voegen. Je roept de methode aan met de list met de nieuwe elementen als argument.

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

Net als bij de append() methode kun je in plaats van de extend() methode de \(+\) operator gebruiken en het resultaat toekennen aan de originele list. En net als bij de append() methode, is het gebruik van de extend() methode te prefereren vanwege de leesbaarheid. <list>.extend(<addlist>) is equivalent met <list>[len(<list>):] = <addlist>.

insert()

insert() geeft de mogelijkheid een element aan een list toe te voegen op een specifieke positie. Je roept de methode aan met twee argumenten, waarvan de eerste de index is van de positie waar het nieuwe element moet komen, en de tweede het nieuwe element zelf. Als je een element toe wilt voegen aan het begin van de list, kun je index 0 gebruiken.

fruitlist = ["appel", "banaan", "kers", "doerian"]
print( fruitlist )
fruitlist.insert( 2, "mango" )
print( fruitlist )

<list>.insert(<i>,<element>) is equivalent met <list>[<i>:<i>] = [<element>].

remove()

remove() laat je een element van de list verwijderen. Het element dat je wilt verwijderen geef je mee als argument. Als dit element meerdere keren voorkomt in de list, wordt de eerste instantie (die met de laagste index) verwijderd. Als je een element probeert te verwijderen dat niet voorkomt op de list, geeft dat een runtime error.

fruitlist = ["appel", "banaan", "kers", "doerian"]
print( fruitlist )
fruitlist.remove( "banaan" )
print( fruitlist )

pop()

Net als remove(), verwijdert pop() een element van de list, maar doet dat via een index. Er is één numeriek argument, dat optioneel is, dat de index is van het te verwijderen element. Als geen argument wordt meegegeven, wordt het laatste element van de list verwijdered. Als een index wordt meegegeven die buiten de list valt, volgt een runtime error.

Een groot verschil tussen remove() en pop() is dat pop() een retourwaarde heeft, namelijk het element dat verwijderd is. Dit zorgt ervoor dat je via pop() snel alle elementen van een list kunt verwerken terwijl je de list leegmaakt.

fruitlist = ["appel", "banaan", "kers", "doerian"]
print( fruitlist )
print( fruitlist.pop() )
print( fruitlist )
print( fruitlist.pop( 0 ) )
print( fruitlist )

del

del is noch een methode noch een functie, maar omdat het vaak in één adem genoemd wordt met remove() en pop(), zet ik het hier neer. del is een gereserveerd woord dat een list element verwijderd, of zelfs een sub-list, via de index. Het lijkt op wat pop() doet, maar heeft geen retourwaarde. pop() kan ook niet gebruikt worden op sub-lists. del gebruik je via de syntax del <list>[<index>] of del <list>[<index1>:<index2>].

fruitlist = ["appel", "banaan", "kers", "banaan", "doerian"]
del fruitlist[3]
print( fruitlist )

index()

index() retourneert de index van de eerste instantie in een list van het element dat als argument aan de methode is meegegeven. Een runtime error volgt als het element niet voorkomt op de list.

fruitlist = ["appel", "banaan", "kers", "banaan", "doerian"]
print( fruitlist.index( "banaan" ) )

count()

count() retourneert een integer die aangeeft hoe vaak het element dat als argument is meegegeven voorkomt in de list.

fruitlist = ["appel", "banaan", "kers", "banaan", "doerian"]
print( fruitlist.count( "banaan" ) )

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 len_alfabetisch() functie een tuple retourneert. Zoals in hoofdstuk 121 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.

Op dit punt kan ik een typisch voorbeeld geven van het gebruik van een “anonieme functie,” die ik introduceerde in hoofdstuk 92 (als je die niet hebt overgeslagen). Als je een anonieme functie gebruikt om de key voor een sort() methode te specificeren, in plaats van als een separate functie elders in het programma, houd je de code compact en leesbaar.

fruitlist = ["appel", "aardbei", "banaan", "framboos", "kers", "banaan", "doerian", "mango"]
fruitlist.sort( key=lambda x: (len(x),x) )
print( fruitlist )

reverse()

reverse() zet de elementen van de list in omgekeerde volgorde.

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

Oefening

Schrijf een programma dat de gebruiker vraagt wat data in te geven, bijvoorbeeld de namen van zijn of haar vrienden. De gebruiker geeft aan te stoppen met data ingeven als alleen Enter wordt ingedrukt. Het programma toont dan alle ingegeven data items, alfabetisch gesorteerd. Print ieder item apart, op een eigen regel.

Sorteer een list van nummers op absolute waarde. Hint: Gebruik de abs() functie als key.

Tel hoe vaak iedere letter (case-insensitive) voorkomt in een string. Je mag alle tekens negeren die geen letter zijn. Je zou dit natuurlijk kunnen doen met 26 variabelen, maar het is veel beter om een list te gebruiken. Zet alle 26 elementen van de list bij de start op 0. Wanneer de letters geteld zijn, druk je alle resulterende tellingen af. Als index voor de list kun je ord(letter) - ord("a") gebruiken, waarbij “letter” een kleine letter is (de functie ord() is uitgelegd in hoofdstuk 113).