De set() functie begrijpen

In python is set()een ongeordende verzameling zonder dubbele elementen. Ik kan echter niet begrijpen hoe het de output genereert.

Beschouw bijvoorbeeld het volgende:

>>> x = [1, 1, 2, 2, 2, 2, 2, 3, 3]
>>> set(x)
set([1, 2, 3])
>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8]
>>> set(y)
set([8, 1, 6])
>>> z = [1, 1, 6, 6, 6, 6, 6, 7, 7]
>>> set(z)
set([1, 6, 7])

Moet de uitvoer van set(y)niet zijn: set([1, 6, 8])? Ik heb de bovenstaande twee geprobeerd in Python 2.6.


Antwoord 1, autoriteit 100%

Sets zijn ongeordend, zoals je zegt. Hoewel een manier om sets te implementeren een boomstructuur is, kunnen ze ook worden geïmplementeerd met behulp van een hashtabel (wat betekent dat het niet zo triviaal is om de sleutels in gesorteerde volgorde te krijgen).

Als je ze wilt sorteren, kun je eenvoudig het volgende doen:

sorted(set(y))

wat een gesorteerde lijst oplevert met de elementen van de set. (Geen set. Nogmaals, sets zijn ongeordend.)

Anders is het enige dat door setwordt gegarandeerd, dat het de elementen uniek maakt (niets zal er meer dan één keer zijn).

Hopelijk helpt dit!


Antwoord 2, autoriteit 19%

Als een ongeordend verzamelingstype is set([8, 1, 6])gelijk aan set([1, 6, 8]).

Hoewel het misschien leuker is om de inhoud van de set in gesorteerde volgorde weer te geven, zou dat de repr()-aanroep duurder maken.

Intern wordt het type setgeïmplementeerd met behulp van een hash-tabel: een hash-functie wordt gebruikt om items in een aantal buckets te scheiden om het aantal gelijkheidsbewerkingen te verminderen dat nodig is om te controleren of een item deel uitmaakt van de set.

Om de repr()-uitvoer te produceren, voert het om de beurt de items uit elke bucket uit, wat waarschijnlijk niet de gesorteerde volgorde is.


Antwoord 3, autoriteit 9%

Zoals +Volatiliteit en uzelf hebben aangegeven, zijn sets ongeordend. Als je de elementen op orde wilt hebben, bel dan gewoon sortedop de set:

>>> y = [1, 1, 6, 6, 6, 6, 6, 8, 8]
>>> sorted(set(y))
[1, 6, 8]

Antwoord 4, autoriteit 7%

Python’s sets (en woordenboeken) worden herhaald en afgedrukt in enigevolgorde, maar wat die volgorde precies zal zijn, is willekeurig en er is geen garantie dat deze hetzelfde blijft na toevoegingen en verwijderingen.

>

Hier is een voorbeeld van een ingestelde wijzigingsvolgorde nadat veel waarden zijn toegevoegd en vervolgens verwijderd:

>>> s = set([1,6,8])
>>> print(s)
{8, 1, 6}
>>> s.update(range(10,100000))
>>> for v in range(10, 100000):
    s.remove(v)
>>> print(s)
{1, 6, 8}

Dit is echter afhankelijk van de implementatie, dus u moet er niet op vertrouwen.


Antwoord 5, autoriteit 3%

Na het lezen van de andere antwoorden, had ik nog steeds moeite om waaromde set ongeordend uit te brengen.

Ik zei dit tegen mijn partner en hij kwam met deze metafoor: neem knikkers. Je stopt ze in een koker die iets breder is dan marmerbreedte: je hebt een lijst. Een set is echter een tas. Ook al voer je de knikkers één voor één in de zak; als je ze uit een zak terug in de buis giet, zullen ze niet in dezelfde volgorde staan ​​(omdat ze allemaal in een zak door elkaar zijn gehaald).

Other episodes