Achtergrond:
Verzamelingen (set) werden geïntroduceerd in Python als een apart ingebouwd type vanaf Python 2.4 (voorheen werden ze geïmplementeerd als een externe module). Ze maken het mogelijk om efficiënt unieke, ongeordende elementen op te slaan en ondersteunen een aantal standaardverzamelingsoperaties: unie, doorsnede, verschil, symmetrisch verschil en controle van deelverzamelingen.
Probleem:
Zonder set moet je lijsten gebruiken, wat leidt tot inefficiënte zoekopdrachten naar unieke elementen, wat de algoritmen vertraagt die veel lidmaatschapscontroles gebruiken. Set is geïmplementeerd via een hash-tabel, waardoor alle zoek-, toevoegings- en verwijderoperaties worden uitgevoerd in amortized O(1) tijd. Deze structuur kan echter onverwachte problemen veroorzaken – zoals het verliezen van de volgorde van elementen, beperkingen op de types elementen (ze moeten onveranderlijk en hashbaar zijn), en misverstanden over de vergelijkingen tussen verzamelingen en hun interactie met andere structuren.
Oplossing:
Gebruik set wanneer je alleen unieke elementen wilt opslaan en operaties uit de verzamelingsleer wilt uitvoeren. Houd er rekening mee dat de elementen hashbaar moeten zijn (bijvoorbeeld getallen, strings, tuples, maar geen lijsten en geen dicts). Voor het werken met sets is er een uitgebreide set ingebouwde methoden beschikbaar (add, remove, union, intersection, difference, issubset, enzovoort).
Voorbeeldcode:
s1 = {1, 2, 3, 4} s2 = {3, 4, 5} print(s1 | s2) # {1, 2, 3, 4, 5} (unie) print(s1 & s2) # {3, 4} (doorsnede) print(s1 - s2) # {1, 2} (verschil) print(3 in s1) # True (lidmaatschapscontrole)
Belangrijke kenmerken:
Kan ik veranderlijke types (zoals lijsten) toevoegen aan een set?
Nee, de elementen van een verzameling moeten hashbaar en onveranderlijk zijn. Een lijst of dict kan niet aan een set worden toegevoegd, Python zal een TypeError genereren.
s = set() s.add([1, 2, 3]) # TypeError: unhashable type: 'list'
Behouden sets de volgorde van elementen?
Nee. Vanaf het moment dat een set wordt gemaakt, worden de elementen niet gegarandeerd in de volgorde teruggegeven waarin ze zijn toegevoegd, vooral niet als de grootte van de verzameling verandert.
s = {5, 2, 8, 1} print(s) # Volgorde niet gedefinieerd
Wat is het verschil tussen set en frozenset, en kan frozenset als een element van set worden gebruikt?
Frozenset is een onveranderlijke variant van set. Het kan worden gebruikt als een element van een andere set of als sleutel in een dict, omdat het hashbaar is.
fs = frozenset([1, 2, 3]) s = set() s.add(fs) # OK
Een ontwikkelaar wilde unieke elementen opslaan en koos set, zonder rekening te houden met de volgorde van hun verschijning. Hierdoor werkte een deel van de bedrijfslogica, dat afhankelijk was van de volgorde van verwerking, niet meer.
Voordelen:
Nadelen:
In de taak voor het snel filteren van unieke records uit een grote set werd set gekozen, omdat alleen het feit van uniciteit belangrijk was, niet de volgorde. De prestaties stegen aanzienlijk, de code werd eenvoudiger.
Voordelen:
Nadelen: