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

squares(3)

[1, 4, 9]

squares(0)

[]

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

without([1, 0, 2, 0], 0)

[1, 2]

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

["de", "toren"]

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

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

highest([1, 9, 5], [4, 2, 5])

[4, 9, 5]

highest([], [])

[]

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

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_above(numbers, limit) die teruggeeft hoeveel getallen in numbers groter zijn dan limit. Gebruik sum met een list comprehension.

Aanroep

Resultaat

count_above([3, 8, 5], 4)

2

count_above([], 4)

0

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

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

staircase(3)

[[1], [1, 2], [1, 2, 3]]

staircase(0)

[]

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