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 werkcollege 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 mult_of_five(n) die een lijst teruggeeft met de eerste
n veelvouden van 5. 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 mult_of_five(0) == []
assert mult_of_five(1) == [5]
assert mult_of_five(3) == [5, 10, 15]
Opdracht 3¶
Schrijf een functie divisible_by(n, L) die een lijst teruggeeft met de
getallen uit L die deelbaar zijn door n, in dezelfde volgorde.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
Hint
Een getal x is deelbaar door n als x % n == 0. Dat is je filter.
# jouw oplossing
assert divisible_by(5, [15, 0, 23, 4]) == [15, 0]
assert divisible_by(3, [2, 4, 8, 10]) == []
assert divisible_by(2, []) == []
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 zipper(L1, L2) die twee even lange lijsten element voor
element combineert tot een lijst van lijsten. Gebruik zip.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
Hint
zip(L1, L2) levert paren op. Pak elk paar uit in twee variabelen, en zet ze in
de nieuwe lijst samen in een lijst.
# jouw oplossing
assert zipper([1, 3, 5], [2, 4, 6]) == [[1, 2], [3, 4], [5, 6]]
assert zipper([10, 9, 12], ["jan", "feb", "mrt"]) == [
[10, "jan"],
[9, "feb"],
[12, "mrt"],
]
assert zipper([], []) == []
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_vowels(s) die teruggeeft hoeveel klinkers er in de
string s staan. Klinkers zijn a, e, i, o en u. Gebruik sum met een
list comprehension.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
Hint
Maak een lijst met een 1 voor elke klinker, en tel die op.
# jouw oplossing
assert count_vowels("vuurtoren") == 4
assert count_vowels("bbc") == 0
assert count_vowels("") == 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 mul_table(n) die de tafel van vermenigvuldiging van 1 tot
en met n teruggeeft, als lijst van lijsten. Gebruik een geneste comprehension.
Aanroep |
Resultaat |
|---|---|
|
|
|
|
Hint
Begin met één rij: rij y is [x * y for x in range(1, n + 1)]. Zet die
comprehension daarna op de plek van wat erin komt, in een comprehension over
alle rijen.
# jouw oplossing
assert mul_table(0) == []
assert mul_table(1) == [[1]]
assert mul_table(2) == [[1, 2], [2, 4]]
assert mul_table(3) == [[1, 2, 3], [2, 4, 6], [3, 6, 9]]