Opstap¶
List comprehensions¶
Leerdoel: een list comprehension lezen en schrijven, met een filter, met
range, enumerate en zip, en met een conditionele expressie.
Deze opdrachten horen bij het eerste college van deze week. Ze zijn kaal met opzet, net als in week 1: ze oefenen de handgrepen, zodat je in de basis en het practicum met het probleem bezig kunt zijn in plaats van met de syntaxis.
Opdracht 1¶
Voorspel eerst welke lijst elke regel in de cel hieronder afdrukt:
Regel |
Jouw voorspelling |
|---|---|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
Voer daarna de cel uit en vergelijk de uitvoer met je voorspelling. Klopt een regel niet, zoek dan uit welk deel van de comprehension je anders las.
print([len(w) for w in ["de", "vuurtoren", "draait"]])
print([w for w in ["de", "vuurtoren", "draait"] if len(w) > 2])
print([x for x in range(10) if x % 3 == 0])
print([i for i, c in enumerate("toren") if c in "aeiou"])
print([a + b for a, b in zip([1, 2, 3], [10, 20, 30])])
print(["hoog" if x > 5 else "laag" for x in [3, 8, 5]])
Opdracht 2¶
Schrijf een functie squares(n) die een lijst teruggeeft met de kwadraten
van 1 tot en met n. Gebruik een list comprehension met range.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
Hint
range begint bij 0. Met range(1, n + 1) loop je van 1 tot en met n.
# jouw oplossing
assert squares(0) == []
assert squares(1) == [1]
assert squares(3) == [1, 4, 9]
Opdracht 3¶
Schrijf een functie without(L, x) die een lijst teruggeeft met de
elementen uit L die niet gelijk zijn aan x, in dezelfde volgorde.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
Hint
Het filter achteraan houdt over wat je wilt bewaren. Hier is dat
if element != x.
# jouw oplossing
assert without([1, 0, 2, 0], 0) == [1, 2]
assert without(["de", "toren"], "licht") == ["de", "toren"]
assert without([], 0) == []
Opdracht 4¶
Schrijf een functie positions(L, x) die een lijst teruggeeft met de posities
waarop x in L staat. Gebruik enumerate.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
Hint
for i, element in enumerate(L) geeft je bij elke stap de positie i en het
element. Wat in de nieuwe lijst komt, is de positie.
# jouw oplossing
assert positions(["de", "toren", "de"], "de") == [0, 2]
assert positions(["de", "toren"], "licht") == []
assert positions([], "de") == []
Opdracht 5¶
Schrijf een functie highest(L1, L2) die twee even lange lijsten met
getallen vergelijkt en per positie het grootste van de twee getallen
teruggeeft. Gebruik zip.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
Hint
zip(L1, L2) levert paren op. Pak elk paar uit in twee variabelen, en kies
met de ingebouwde functie max de grootste van de twee.
# jouw oplossing
assert highest([1, 9, 5], [4, 2, 5]) == [4, 9, 5]
assert highest([-1, -9], [-4, -2]) == [-1, -2]
assert highest([], []) == []
Opdracht 6¶
Schrijf een functie frost(temperatures) die voor elke temperatuur in de lijst
"vorst" teruggeeft als het 0 graden of kouder is, en anders "dooi". Gebruik
een conditionele expressie.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
Hint
De conditionele expressie staat vooraan, op de plek van wat erin komt:
"vorst" if t <= 0 else "dooi". Een filter achteraan zou temperaturen weglaten,
en dat is hier niet de bedoeling.
# jouw oplossing
assert frost([-1, 0, 10]) == ["vorst", "vorst", "dooi"]
assert frost([21, -21]) == ["dooi", "vorst"]
assert frost([]) == []
Dict en set comprehensions¶
Leerdoel: een set comprehension en een dict comprehension schrijven, tellen met
sum, en een lijst van lijsten maken, ook met een geneste comprehension.
Deze opdrachten horen bij het tweede college van deze week.
Opdracht 7¶
Voorspel eerst wat elke regel in de cel hieronder afdrukt:
Regel |
Jouw voorspelling |
|---|---|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
Voer daarna de cel uit en vergelijk de uitvoer met je voorspelling. Bij een set kan de volgorde bij jou anders zijn.
print({c for c in "vuurtoren"})
print({w: len(w) for w in ["licht", "nacht"]})
print({x % 3 for x in range(10)})
print([[y] * 2 for y in range(3)])
print([[x * y for x in range(1, 4)] for y in range(1, 3)])
Opdracht 8¶
Schrijf een functie first_letters(words) die de set van beginletters van de
woorden teruggeeft. Gebruik een set comprehension.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
# jouw oplossing
assert first_letters(["de", "vuurtoren", "draait"]) == {"d", "v"}
assert first_letters(["licht"]) == {"l"}
assert first_letters([]) == set()
Opdracht 9¶
Schrijf een functie word_lengths(words) die een dictionary teruggeeft van elk
woord naar zijn lengte. Gebruik een dict comprehension.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
# jouw oplossing
assert word_lengths(["de", "toren"]) == {"de": 2, "toren": 5}
assert word_lengths(["de", "de"]) == {"de": 2}
assert word_lengths([]) == {}
Opdracht 10¶
counts is een telling zoals in week 1: een dictionary van woord naar aantal.
Schrijf een functie common(counts, n) die een dictionary teruggeeft met alleen
de woorden die minstens n keer voorkomen, met hun aantal.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
Hint
Loop de telling langs met .items(), zoals in week 1.
# jouw oplossing
assert common({"de": 3, "toren": 1, "licht": 2}, 2) == {"de": 3, "licht": 2}
assert common({"de": 3}, 4) == {}
assert common({}, 2) == {}
Opdracht 11¶
Schrijf een functie count_above(numbers, limit) die teruggeeft hoeveel
getallen in numbers groter zijn dan limit. Gebruik sum met een list
comprehension.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
Hint
Maak een lijst met een 1 voor elk getal dat groter is dan limit, en tel
die op.
# jouw oplossing
assert count_above([3, 8, 5], 4) == 2
assert count_above([3, 8, 5], 10) == 0
assert count_above([], 4) == 0
Opdracht 12¶
Schrijf een functie grid(width, height) die een raster teruggeeft: een lijst
van height rijen, elk met width keer de string ".". Gebruik een list
comprehension.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
Hint
Het rijnummer heb je niet nodig. Noem die variabele dus _.
# jouw oplossing
assert grid(3, 2) == [[".", ".", "."], [".", ".", "."]]
assert grid(1, 1) == [["."]]
assert grid(3, 0) == []
Opdracht 13¶
Schrijf een functie staircase(n) die een trap van n rijen teruggeeft,
waarin rij y de getallen 1 tot en met y bevat. Gebruik een geneste
comprehension.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
Hint
Begin met één rij: rij y is [x for x in range(1, y + 1)]. Zet die
comprehension daarna op de plek van wat erin komt, in een comprehension over
alle rijen.
# jouw oplossing
assert staircase(0) == []
assert staircase(1) == [[1]]
assert staircase(3) == [[1], [1, 2], [1, 2, 3]]