13: Lijsten (Arrays)

Een lijst (Eng.: list) in Python (in vele andere programmeertalen een array genoemd) is een reeks van meerdere variabelen met een naam. In plaats van een programma te schrijven met vele variabelen x0, x1, x2, … kun je een variabele x definiëren en de elementen ervan weergeven door middel van x[0], x[1], x[2], enz. Belangrijker, je kunt uitdrukkingen en variabelen tussen de rechte haken zetten, zoals x[i] en x[i+1]. Dit stelt ons in staat met willekeurig grote verzamelingen data te werken terwijl we er slechts een klein stukje code voor nodig hebben.

Eén manier om een lijst te creëren die een gegeven reeks van waarden bevat, is door de verschillende waarden tussen rechte haken te zetten, gescheiden door een komma:

myList = ["de eerste waarde van de lijst", 1999, 4.5]
Dit creëert een lijst van lengte 3, en kent een verwijzing naar de lijst toe aan variable myList. Ieder element van de lijst heeft een rangnummer, index genaamd: het eerste element heeft index 0, het volgende element index 1, enzovoort. De individuele variabelen die de lijst vormen hebben als naam

«listName»[«indexNumber»]

Zo is in het voorbeeld myList[0] een variabele met waarde "de eerste waarde van de lijst" en print(myList[2]) zal 4.5 afdrukken. Je kunt ook de hele lijst printen:

Voorbeeld
Aanpassen en afdrukken van een lijst.

Zoals je kunt zien, wordt numbers[0] behandeld alsof het een variabele is: je kunt de waarde op die index wijzigen.

Probeer te voorspellen wat de inhoud van mijnLijst is na uitvoering van het volgende programma. Voer het programma vervolgens stap voor stap uit.

Meerkeuze-opgave: Meta-Stuff
Wat is de output van het volgende programmaatje?

stuff = [2, 25, 80, 12]
stuff[stuff[0]] = stuff[3]
print(stuff)
Correct! Kijk naar de toekenningsopdracht (de tweede regel). De waarde van stuff[3] aan de rechterkant is 12. Aan de linkerkant is stuff[0] gelijk aan 2, dus is stuff[stuff[0]] hetzelfde als de variabele stuff[2]. De waarde van deze variabele is veranderd (van 80) in 12.

Wat in Python een lijst wordt genoemd wordt in de meeste andere programmeertalen een array genoemd.

Een gebruikelijke fout

Wanneer je in Python naar een index vraagt die niet bestaat, krijg je een foutmelding:

Voorbeeld
Out-of-range error.

Omdat in bovenstaand voorbeeld myList lengte 4 heeft en de eerste index 0 is, en de grootst mogelijke index 3 is. Vragen naar een element met index van 4, 5, of nog groter heeft deze foutmelding tot gevolg.

Nuttige operaties

De lengte van een lijst: len(«list»)

Om het aantal elementen in een lijst vast te stellen, kun je de functie len() toepassen op de lijst. Kijk hoe  range wordt gebruikt in het volgende voorbeeld.

Voorbeeld
Het vaststellen van de lengte van een lijst en het gebruik ervan om de lijst te doorlopen.

Het is gebruikelijk om len te gebruiken om te kunnen werken met lijsten van willekeurige lengte, zoals in het voorbeeld hierboven, en in het volgende voorbeeld.

Programmeeroefening: De aap in het midden
Schrijf een functie middle(L) met als argument een lijst L, en dat het element teruggeeft dat de middelste (middle) positie inneemt in L. (Om zeker te weten dat het midden bestaat, moet je aannemen dat L een oneven lengte heeft.) Dus geeft middle([8, 0, 100, 12, 1]) het getal 100 terug, want het staat precies in het midden van de lijst.
Voer testcommando's zoals print(myfunction("test argument")) hieronder in.

Zijn lijsten hetzelfde als strings?

Je kunt hebben opgemerkt dat de operaties die toepasbaar zijn op lijsten lijken op die welke toepasbaar zijn op strings: beide kunnen als invoer dienen voor de functie len(), en beide kennen X[«index»] om individuele elementen te benoemen. Lijsten en strings hebben inderdaad veel gemeenschappelijk: het zijn beiden  "rij-types" in Python. Een belangrijk verschil is dat de individuele karakters in strings niet kunnen worden aangepast.

Voorbeeld
Fout veroorzaakt door te proberen een waarde toe te kennen aan een karakter in een string.

Het is om die reden dat lijsten veranderbaar worden genoemd en strings onveranderbaar; je krijgt hier nog wat meer informatie over in les 17.

Samenvoegen en Creatie

Van de les over het str-type, zul je je wellicht herinneren dat je + kunt gebruiken om twee strings samen te voegen (Eng.: concatenate). Hetzelfde kan met lijsten:

Voorbeeld
Lijsten aan elkaar koppelen met +.

Evenzo kun je het symbool * voor vermenigvuldigen gebruiken om een lijst herhaald uit te breiden. Dit is nuttig om een nieuwe lijst te maken van een gewenste lengte.

Voorbeeld
Using *.

Om de volgende opgave te kunnen oplossen gebruik je één van de operatoren die we zojuist hebben geïntroduceerd en een for-lus.

Programmeeroefening: Natuurlijke getallen
`schrijf een functie naturalNumbers die als invoer een positief geheel getal  n heeft en als resultaat de lijst [1, 2, ...] met daarin de eerste n natuurlijke getallen geeft.
Voer testcommando's zoals print(myfunction("test argument")) hieronder in.

Einde van de regel: negatieve indices

Voor het laatste element van een lijst gebruik je:

«listName»[-1]

Meer in het algemeen, geeft L[-k] het kde element  vanaf het einde van de lijst; Python gebruikt dit intern door een vertaling in L[len(L)-k]. Dit werkt ook voor strings!

Programmeeroefening: Palindroom
Een palindroom is een woord dat gespeld van voren naar achteren hetzelfde is als van achteren naar voren. Bijvoorbeeld: het Engelse woord, racecar is een palindroom: de eerste en de laatste letter (r) zijn hetzelfde, de tweede en de op de twee na laatste letter (a) zijn hetzelfde, enz. Schrijf een functie isPalindrome(S) dat een string S als argument neemt, en True teruggeeft wanneer de string een palindroom is en False wanneer dat niet het geval is.
Voer testcommando's zoals print(myfunction("test argument")) hieronder in.

max en sum

De functie max die we eerder hebben gezien kan ook toegepast worden op een lijst met getallen: het geeft het grootste getal in de lijst terug. Evenzo geeft de functie sum(L) de som van de elementen van de lijst L terug.

Voorbeeld

Programmeeroefening: Product
Definieer een functie prod(L) die het product van de elementen van een lijst L geeft.
Voer testcommando's zoals print(myfunction("test argument")) hieronder in.

Een lijst doorlopen

Het is zeer gebruikelijk (zoals in de vorige oefening) om elke waarde van een lijst te doorlopen. Python heeft daarvoor een afkorting waarmee dat kan, meestal een "voor alle"-lus (Eng.: for-each loop) genoemd. Specifiek, wanneer L een lijst is, dan doet

for x in L:
  «lichaam»
het volgende: eerst wordt x gelijkgesteld aan de eerste waarde  van  L en wordt het lichaam uitgevoerd; daarna wordt x gelijkgesteld aan de tweede waarde van L en het lichaam uitgevoerd; dit wordt vervolgd voor alle elementen van L.

Programmeeroefening: for in
Definieer de functie prod(L) zoals eerder, maar gebruik deze nieuwe vorm van de lus.
Voer testcommando's zoals print(myfunction("test argument")) hieronder in.

"Voor alle"-lussen werken ook met strings: probeerfor char in "hello".

Goed gedaan! je kunt doorgaan naar de volgende les of probeer als bonus enkele van de oefeningen hieronder.


Oefening met Kort Antwoord: Mystery Function
Voor welke waarde van x zal mystery(x) oneindig lang voortduren?

def mystery(x):
a = [0, 4, 0, 3, 2]
while x > 0:
x = a[x]
return "Done"
Correct!

Volgorde-oefening: à la Mode
De modus van een lijst is het element dat het vaakst voorkomt. Verbeter het volgende programma zodanig dat mode(L) de modus opspoort. Neem aan dat de lijst L bestaat uit getallen 0 tot en met 9. (In onze tests zijn er nooit twee getallen die beide maximaal voorkomen.)
  • return i
  • def mode(L):
  • frequency[i] = frequency[i] + 1
  • frequency = [0]*10
  • if frequency[i]==max(frequency):
  • for i in L:
  • for i in range(0, 10):