Opstap

Deze pagina bevat uitvoerbare code.

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

mult_of_five(3)

[5, 10, 15]

mult_of_five(0)

[]

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

divisible_by(5, [15, 0, 23, 4])

[15, 0]

divisible_by(3, [2, 4, 8, 10])

[]

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

positions(["de", "toren", "de"], "de")

[0, 2]

positions(["de", "toren"], "licht")

[]

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

zipper([1, 3, 5], [2, 4, 6])

[[1, 2], [3, 4], [5, 6]]

zipper([], [])

[]

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

frost([-1, 0, 10])

["vorst", "vorst", "dooi"]

frost([])

[]

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

first_letters(["de", "vuurtoren", "draait"])

{"d", "v"}

first_letters([])

set()

# 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

word_lengths(["de", "toren"])

{"de": 2, "toren": 5}

word_lengths([])

{}

# 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

common({"de": 3, "toren": 1, "licht": 2}, 2)

{"de": 3, "licht": 2}

common({}, 2)

{}

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

count_vowels("vuurtoren")

4

count_vowels("")

0

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

grid(3, 2)

[[".", ".", "."], [".", ".", "."]]

grid(3, 0)

[]

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

mul_table(3)

[[1, 2, 3], [2, 4, 6], [3, 6, 9]]

mul_table(0)

[]

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]]