← Python/Verzamelen en veranderen
Les 6 van 8
MODULE 04 · 06◷ 26 min

Bouw collecties met comprehensions

Na deze les kun je
  • Een transformatie als list comprehension schrijven
  • Waarden tijdens verzamelen filteren
  • Dictionary- en setcomprehensions onderscheiden

Je hebt een lijst met oefentijden in minuten en wilt alleen de echte werkblokken omrekenen naar seconden. Daarvoor kun je een lege lijst maken, de tijden doorlopen en geschikte antwoorden toevoegen. Een comprehension schrijft datzelfde verzamelpatroon compact op.

Verzamel de antwoorden van een bewerking

Een comprehension bouwt een nieuwe collectie door invoer te doorlopen. Bij een list comprehension staan vierkante haken om de bewerking en de lus. [minutes * 60 for minutes in durations] verzamelt voor iedere invoerwaarde het berekende aantal seconden.

Lees zo'n regel in uitvoeringsvolgorde: neem een waarde uit durations, geef haar tijdelijk de naam minutes en bereken wat vóór for staat. Voeg dat antwoord toe aan de nieuwe lijst. Herhaal dit voor de volgende waarde.

De lijst behoudt de volgorde van de invoer. Een lege invoer levert een lege lijst op. De oorspronkelijke lijst wordt door dit lezen en verzamelen niet veranderd.

Filteren vóór het verzamelen

Een filter beslist welke invoerwaarden meedoen. In een comprehension staat die voorwaarde achteraan, zoals if minutes > 0. Python controleert haar voor een invoerwaarde voordat het antwoord voor die waarde wordt verzameld.

Druk op Voorbeeld uitvoeren. De nulminutenblokken vallen weg en de positieve tijden worden omgerekend; daarna zie je twee andere soorten comprehensions.

Werkblokken omrekenen en labels verzamelen
durations = [0, 2, 5, 0, 3]
seconds = [minutes * 60 for minutes in durations if minutes > 0]
print(seconds)
print(durations)
labels = ["lezen", "maken", "lezen"]
loud = {label: label.upper() for label in labels}
print(loud)
unique = {label.upper() for label in labels}
print(len(unique))
Verwachte uitvoer
[120, 300, 180]
[0, 2, 5, 0, 3]
{'lezen': 'LEZEN', 'maken': 'MAKEN'}
2
Invoer in minutenGroter dan nul?Opgenomen antwoord
0NeeGeen element
2Ja120
5Ja300
0NeeGeen element
3Ja180

Een filter maakt geen lege plaats voor een afgewezen element. Daarom heeft de uitvoerlijst drie elementen terwijl de invoer er vijf had. De onderlinge volgorde van twee, vijf en drie blijft wel behouden.

Kies de vorm van het resultaat

Een dictionary comprehension gebruikt accolades met een dubbele punt vóór for. Links van die dubbele punt bereken je de sleutel, rechts de waarde. In het voorbeeld wordt ieder label aan zijn hoofdletterversie gekoppeld.

Een sleutel komt maar één keer in een dictionary voor. Het herhaalde label lezen maakt daarom geen tweede gelijknamig paar. Je krijgt een koppeling per unieke sleutel.

Een set comprehension gebruikt accolades zonder zo'n dubbele punt. Zij verzamelt alleen waarden en bewaart die uniek. Het voorbeeld heeft daardoor twee unieke hoofdletterlabels; er hoort geen positievolgorde bij die set.

De buitenste haken vertellen dus wat je maakt. Kies vierkante haken voor een lijst, accolades met sleutel en waarde voor een dictionary en accolades met alleen een waarde voor een set. Het resultaat moet passen bij de opdracht, ook als de getoonde inhoud op elkaar lijkt.

Veelgemaakte fout: de voorwaarde als antwoord opslaan

Wat vóór for staat wordt verzameld. Zet je daar alleen de vergelijking, dan krijg je een lijst booleans. Deze zelfstandige foutvariant bevat geen filter achteraan.

Een vergelijking verzamelen filtert de invoer niet
durations = [0, 2, 5, 0, 3]
seconds = [minutes > 0 for minutes in durations]
print(seconds)
Verwachte uitvoer
[False, True, True, False, True]

Er verschijnen vijf antwoorden: False, True, True, False en True. Python heeft voor iedere invoerwaarde de vergelijking berekend en bewaard. Het heeft geen minuten verwijderd of omgerekend.

Zet de gewenste berekening vóór for en de selecterende voorwaarde achteraan. Controleer daarbij of een grens zelf mag meetellen: positief betekent groter dan nul, zodat nul in deze opdracht wordt overgeslagen.

Veilig een eerste teken kiezen

De opdracht voor beginletters moet lege woorden overslaan voordat zij index nul gebruikt. Lege tekst geldt in een voorwaarde als onwaar, dus if word laat alleen niet-lege woorden door. Van die woorden mag je vervolgens het eerste teken lezen en met .upper() omzetten.

Voor woordlengtes gebruik je len(word), de lengte die Python voor die tekst geeft. Python telt daarbij Unicode-codepunten, geen bytes. De invoer is al opgeschoond; zelf randspaties verwijderen hoort niet bij deze opdrachten.

AAN DE SLAG 0/4
1

Transformeer ieder getal

Laat squares een nieuwe lijst met kwadraten in invoervolgorde teruggeven.

2

Filter zonder nul mee te nemen

Laat positives alleen waarden groter dan nul behouden.

3

Maak sleutel-waardeparen

Laat word_lengths ieder uniek woord aan zijn lengte koppelen.

4

Verzamel unieke beginletters

Laat initials hoofdletters van niet-lege woorden als set teruggeven.

Wat je meeneemt

  • Vóór for staat wat je verzamelt; een if achteraan bepaalt wat meedoet.
  • De haken bepalen of je een lijst, dictionary of set maakt.
  • Filter ongeldige invoer vóór een bewerking die daarop niet kan werken, zoals index nul van lege tekst.

Hierna gebruik je deze bouwstenen bij tabellen en andere gegevens met meerdere lagen.

main.py
UitvoerPython
›
›_

Hier komt je resultaat.

Voer je code uit en ontdek
wat je hebt gemaakt.

0/4 stappen
EVEN MEEKIJKEN

Bekijk hoe het kan.

Je mag de oplossing bekijken. Deze poging telt dan niet mee als afgeronde les. Met Reset kun je daarna opnieuw zelf oefenen.