Ga naar hoofdinhoud

13 Sets

Je kent lijsten, tuples en dictionaries. Er is nog één datatype dat je vaak tegenkomt: kijk wat er gebeurt als je een lijst met dubbele namen in set() stopt.

stemmen = ["Sara", "Alex", "Sara", "Maria", "Alex", "Sara"]

unieke_stemmers = set(stemmen)
print(unieke_stemmers) # {'Maria', 'Alex', 'Sara'}
print(len(unieke_stemmers)) # 3

Een set is een verzameling waarin elk element maar één keer voorkomt. Dubbelen verdwijnen vanzelf. En de volgorde? Die is er niet: een set onthoudt niet wat er eerst kwam, dus de volgorde van de print kan bij jou anders zijn.

Een set maken

Met accolades, net als een dictionary — maar zonder dubbele punten:

kleuren = {"rood", "groen", "blauw"}

Let op: {} maakt een lege dictionary, geen lege set. Een lege set maak je met set():

leeg = set()
print(leeg) # set()

Toevoegen en checken

Voor een set heb je maar drie handelingen nodig:

bezocht = set()

bezocht.add("A") # voeg toe
bezocht.add("B")
bezocht.add("A") # stond er al: er verandert niets

print("A" in bezocht) # True
print("C" in bezocht) # False

bezocht.remove("B") # haal weg
print(bezocht) # {'A'}

add op iets dat er al in zit is geen fout — de set blijft onveranderd. Precies daarom is een set zo handig om bij te houden wat je al gehad hebt.

Set of lijst?

lijstset
Volgorde blijft bewaardjanee
Dubbele waardesmogenverdwijnen
waardes[0] opvragenjanee
Snel checken met intraag bij grote lijstenaltijd snel

Vuistregel: gaat het om de volgorde of om posities, kies een lijst. Gaat het alleen om de vraag "zit dit erin?", kies een set.


Opdracht 13.1: Unieke woorden

Hieronder staat een lijst met woorden waarin dubbelen zitten. Print hoeveel verschillende woorden er zijn.

Verwachte uitvoer:

Er zijn 4 verschillende woorden
woorden = ["appel", "peer", "appel", "banaan", "kers", "peer", "appel"]

# Schrijf hier je code
Klik hier voor een tip.

set(woorden) gooit de dubbelen weg. len() werkt op een set net als op een lijst.

Klik hier voor de oplossing.
woorden = ["appel", "peer", "appel", "banaan", "kers", "peer", "appel"]

uniek = set(woorden)
print(f"Er zijn {len(uniek)} verschillende woorden")
woorden = ["appel", "peer", "appel", "banaan", "kers", "peer", "appel"]

uniek = set(woorden)
print(f"Er zijn {len(uniek)} verschillende woorden")

Opdracht 13.2: Al geweest?

Je loopt een route langs plekken, maar sommige plekken komen dubbel voor. Print bij elke plek of je er voor het eerst bent of al eerder geweest bent. Houd de bezochte plekken bij in een set.

Verwachte uitvoer:

park: nieuw
markt: nieuw
park: al geweest
school: nieuw
markt: al geweest
route = ["park", "markt", "park", "school", "markt"]

# Schrijf hier je code
Klik hier voor een tip.

Begin met een lege set. Check in de loop eerst met in of de plek er al in zit, en voeg hem daarna toe met add.

Klik hier voor de oplossing.
route = ["park", "markt", "park", "school", "markt"]

bezocht = set()
for plek in route:
if plek in bezocht:
print(f"{plek}: al geweest")
else:
print(f"{plek}: nieuw")
bezocht.add(plek)

Dit patroon — een bezocht-set die je vult terwijl je loopt — kom je later vaak tegen, bijvoorbeeld in zoekalgoritmes.

route = ["park", "markt", "park", "school", "markt"]

bezocht = set()
for plek in route:
  if plek in bezocht:
      print(f"{plek}: al geweest")
  else:
      print(f"{plek}: nieuw")
  bezocht.add(plek)

Opdracht 13.3: Gemeenschappelijke hobby's (uitdaging)

Twee leerlingen hebben elk een lijst hobby's. Print welke hobby's ze allebei hebben.

Verwachte uitvoer (volgorde mag anders):

{'gamen', 'voetbal'}
hobbys_sara = ["gamen", "lezen", "voetbal", "tekenen"]
hobbys_alex = ["voetbal", "gamen", "zwemmen"]

# Schrijf hier je code
Klik hier voor een tip.

Maak van allebei een set. Loop over de ene set en check met in of de hobby ook in de andere zit — of zoek op wat de &-operator met twee sets doet.

Klik hier voor de oplossing.
hobbys_sara = ["gamen", "lezen", "voetbal", "tekenen"]
hobbys_alex = ["voetbal", "gamen", "zwemmen"]

samen = set(hobbys_sara) & set(hobbys_alex)
print(samen)

De &-operator geeft de doorsnede: alles wat in beide sets zit. Met een loop en in kom je op hetzelfde antwoord.

hobbys_sara = ["gamen", "lezen", "voetbal", "tekenen"]
hobbys_alex = ["voetbal", "gamen", "zwemmen"]

samen = set(hobbys_sara) & set(hobbys_alex)
print(samen)

En nu?

Gefeliciteerd. Je hebt de basis van Python onder de knie: variabelen, rekenen, tekst, beslissingen, herhaling, functies, lijsten, tuples, dictionaries en sets. Hiermee kun je echte programma's bouwen.

Klaar om iets visueels te maken — animaties, kleine games, dingen die bewegen? Ga dan verder met play-docs. Daar leer je hoe je met de play-bibliotheek vormen tekent, ze laat bewegen en reageert op toetsenbord en muis. Alle Python die je hier hebt geleerd, gebruik je daar opnieuw.

Liever elke dag even kort oefenen? Op pydle.net staat dagelijks een nieuwe puzzel die je met loops en if-statements oplost.