Du har lister for rekkefølge, dictionaries for oppslag, og tuples for data som ikke skal endres. Men hva bruker du når du trenger en samling der hver verdi bare finnes en gang, og rekkefølgen ikke spiller noen rolle? Da er set det rette valget.
Et set i Python er en uordnet samling av unike verdier. Det betyr at du aldri får duplikater, og du kan ikke hente ut elementer med indeks slik du gjør med en liste. Til gjengjeld får du lynraske oppslag og et sett med metoder som er perfekte for å sammenligne data.
Slik lager du et set i Python
Du lager et set med krøllparenteser, akkurat som en dictionary, men uten nøkler:
fruits = {"eple", "banan", "mango", "pære"}
Skriver du type(fruits), får du tilbake <class 'set'>. Prøver du derimot fruits[0], får du en TypeError. Set støtter ikke indeksering.
Du kan fortsatt iterere gjennom et set med en for-løkke, sjekke om en verdi finnes med in, og finne lengden med len(). Det som mangler er garantien om rekkefølge. Hver gang du printer et set, kan elementene komme i en annen orden.
Legg til og fjern verdier
For å legge til et enkelt element bruker du add():
fruits.add("melon")
For å fjerne et element bruker du discard(). Forskjellen fra remove() er at discard ikke gir feil hvis verdien ikke finnes:
fruits.discard("pære")
Skal du legge til flere verdier på en gang, bruker du update() med en annen samling:
fruits.update({"kiwi", "fersken", "ananas"})
Dette endrer det originale settet. Vil du heller lage et nytt set som kombinerer to sett uten å endre noen av dem, bruker du union():
all_fruits = fruits.union(more_fruits)
Sammenlign sett med mengdemetoder
Det som virkelig skiller set fra andre datastrukturer er metodene for mengdelære. Disse lar deg sammenligne to sett på en måte som ville krevd mange linjer kode med lister.
difference() returnerer verdiene som finnes i det første settet, men ikke i det andre:
names_1 = {"Petra", "Harun", "Alfred"}
names_2 = {"Sara", "Jonas", "Petra"}
names_1.difference(names_2) gir {"Harun", "Alfred"}
intersection() gir deg verdiene som finnes i begge sett. I eksempelet over returnerer names_1.intersection(names_2) bare {"Petra"}.
symmetric_difference() returnerer alt som er unikt for hvert sett. Verdier som finnes i begge, fjernes. Resultatet blir {"Harun", "Alfred", "Sara", "Jonas"}.
I tillegg har du tre metoder som returnerer True eller False:
- isdisjoint() returnerer True hvis settene ikke har noen felles verdier
- issubset() returnerer True hvis alle verdiene i settet finnes i det andre settet
- issuperset() returnerer True hvis settet inneholder alle verdiene fra det andre settet
Når bør du bruke set fremfor en liste?
Bruk set når du trenger å fjerne duplikater fra en samling. Har du en liste med e-postadresser der noen gjentar seg, konverterer du den til et set og tilbake igjen:
unique_emails = list(set(email_list))
Bruk set når du trenger raske oppslag. Å sjekke om en verdi finnes i et set er mye raskere enn i en liste, spesielt med store datamengder. Mens en liste må lete gjennom hvert element, bruker et set en hashtabell internt.
Bruk set når du skal sammenligne to grupper. Hvilke brukere er i begge listene? Hvilke produkter mangler fra lageret? Mengdemetodene gjør dette til en enkel operasjon.
Trenger du derimot å beholde rekkefølgen eller hente ut elementer med indeks, er lister det riktige valget. Og trenger du å knytte verdier til nøkler, passer dictionaries bedre.
Vanlige feil med set
Den vanligste feilen er å prøve å lage et tomt set med {}. Det gir deg en tom dictionary, ikke et set. For å lage et tomt set skriver du set().
En annen feil er å putte lister eller andre set inn i et set. Verdiene i et set må være hashbare, noe som betyr at de ikke kan endres. Tall, strenger og tuples fungerer. Lister og dictionaries gjør det ikke.
Set i Python er dokumentert i detalj i Pythons offisielle dokumentasjon.
Vil du lære mer om datastrukturer og hvordan de brukes i praksis? Python for nybegynnere tar deg gjennom set, lister, dictionaries og tuples med videoer og oppgaver som bygger på hverandre.



