13: Lijsten (Arrays)

Een lijst (in het engels: list) is een groep van meerdere variabelen met een naam. In plaats van een programma te schrijven met vele variabelen x0, x1, x2, … kun je een variabele x definieren 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 data verzamelingen te werken terwijl we slechts een klein stukje code voor nodig hebben.

Een manier om een lijst definiëren om de verschillende waarden tussen de rechte haken te zetten, waarbij de verschillende waarden gescheiden worden door een komma:

myList = ["de eerste waarde van de lijst", 1999, 4.5]
Dit definieert een lijst met de naam myList of length 3. Ieder element van de lijst heeft een rangnummer index genaamd: het eerste element heeft index 0, het volgende element index 1, en zo voort. 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 doen afdrukken. Je kunt ook de waarde van de waarden van de elementen van de lijst, en de hele lijst printen:

Voorbeeld
Updaten en printen van een lijst.

Zoals je kunt zien, wordt numbers[0] behandeld alsof het een variabele is: je kunt het veranderen.

Probeer te voorspellen wat 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 varaibele is veranderd (van 80) in 12.

Wat in Python een lijst wordt genoemd wordt in de meeste andere programmeertalen  een array genoemd. Python kent ook zelf een array maar dat is anders dan de array uit andere talen.

Een gebruikelijke fout

Wanneer je in Python naar een index vraagt dat niet bestaat dan 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.

Gewone 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 midden (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: beiden kunnen als invoer dienen voor de len() functie, en beiden kennen X[«index»] to 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 daarom waarom lijsten veranderbaar worden genoemd en strings onveranderbaar; je krijgt hier nog wat meer informatie over in les 17.

Samenvoegen en Creation

Van de les over het str type, zul je je wellicht herinneren dat je + kunt gebruiken om twee strings samen te voegen (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 een van de operatoren die we zojuist hebben geïntroduceerd en een for loop.

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 invoer, and 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 op een lijst met getallen: het geeft terug het  grootste getal in de lijst. Evenzo geeft de the functie sum(L) de som van de elementen van de lijst L.

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 door te lopen. Python heeft daarvoor een afkorting waarmee dat kan, meestal een "for alle" loop of een "for each" loop. Specifiek, wanneer L een lijst is, dan doet

for x in L:
  «loop body block»
het volgende: eerst wordt x gelijk gemaakt aan de eerste waarde  van  L en wordt de body uitgevoerd; daarna wordt x gelijk gemaakt aan de tweede waarde van L en de body 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 loop.
Voer testcommando's zoals print(myfunction("test argument")) hieronder in.

"For all" loops werkt ook bij strings: try for char in "hello".

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


Kort antwoord opgave: 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!

Scramble Opgave: à 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. Neemt aan dat de lijst L bestaat uit getallen 0 tot en met 9. (In onze tests, zijn er niet twee getallen die even vaak maximaal voorkomen.)
  • frequency[i] = frequency[i] + 1
  • if frequency[i]==max(frequency):
  • for i in L:
  • return i
  • frequency = [0]*10
  • for i in range(0, 10):
  • def mode(L):