2013-03-03 20 views
34

In Python ist set() eine ungeordnete Auflistung ohne doppelte Elemente. Ich bin jedoch nicht in der Lage zu verstehen, wie es die Ausgabe erzeugt.Die Funktion set() verstehen

Betrachten wir zum Beispiel die folgende:

>>> 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]) 

Sollte nicht die Ausgabe von set(y) sein: set([1, 6, 8])? Ich habe die obigen zwei in Python 2.6 versucht.

+35

Sie haben selbst gesagt, dass ein Set eine * ungeordnete Sammlung * ist ... – Volatility

Antwort

50

Sets ungeordnet sind, wie Sie sagen. Obwohl eine Möglichkeit zum Implementieren von Sätzen die Verwendung eines Baums ist, können sie auch unter Verwendung einer Hash-Tabelle implementiert werden (was bedeutet, dass das Abrufen der Schlüssel in einer sortierten Reihenfolge möglicherweise nicht so trivial ist).

Wenn Sie sie sortieren möchten, können Sie einfach durchführen:

sorted(set(y)) 

, die eine sortierte Liste erzeugen wird die Set-Elemente enthält. (Nicht ein Satz. Auch hier sind die Sätze ungeordnet.)

Ansonsten ist die einzige Sache, die von set garantiert wird, dass es die Elemente einzigartig macht (nichts wird mehr als einmal da sein).

Hoffe, das hilft!

+2

Hinweis: Sets können generell mit Bäumen implementiert werden. 'set' in Python kann nicht (sinnvoll), da es garantiert, dass sie die Elemente benötigen, um hashable zu sein und sie nicht benötigen, um vergleichbar zu sein. – delnan

+0

@delnan Netter Punkt. – user

+1

@delnan - Und um ganz klar zu sein, mit * vergleichbar * meinst du * reiche Vergleiche * ('<', '>'). Damit ein Objekt "hashbar" sein kann, muss es "__eq__" implementieren. – mgilson

6

Wie + Volatilität und Sie selbst hingewiesen, sind Sätze ungeordnet. Wenn Sie die Elemente benötigen, um zu sein, rufen Sie einfach sorted am Set:

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

Als ungeordneter Sammlertyp entspricht set([1, 6, 8]).

Während es schöner sein könnte, die Set-Inhalte in sortierter Reihenfolge anzuzeigen, würde das den repr() Aufruf teurer machen. Der interne Typ set wird mithilfe einer Hashtabelle implementiert: Eine Hashfunktion wird verwendet, um Elemente in eine Anzahl von Buckets zu trennen, um die Anzahl der Gleichheitsoperationen zu reduzieren, die erforderlich sind, um zu überprüfen, ob ein Element Teil des Satzes ist.

die repr() Ausgabe zu erzeugen, es gibt nur die Elemente aus jedem Eimer wiederum, was unwahrscheinlich ist, die sortierter Reihenfolge sein.

4

Python-Sets (und Wörterbücher) werden iterieren und ausdrucken in einig Ordnung, aber genau das, was diese Ordnung sein wird, sind willkürlich und nicht gleich nach Ergänzungen und Löschungen bleiben gewährleistet.

Hier ist ein Beispiel eines Satzes zu ändern, um nach vielen Werten hinzugefügt werden und dann entfernt:

>>> 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} 

Diese Implementierung abhängig ist aber, und so sollten Sie nicht darauf verlassen.

1

Ich habe heute die gleiche Frage gestellt und wurde downvoted und mit dieser Antwort verknüpft. Ich hatte immer noch Probleme zu verstehen warum das Set kommt unbestellt.

Ich erwähnte dies zu meinem Partner und er kam mit dieser Metapher: Nimm Murmeln.Du legst sie in eine Röhre, die etwas breiter ist als die Marmorbreite: Du hast eine Liste. Ein Set ist jedoch eine Tasche. Auch wenn du die Murmeln eins nach dem anderen in den Beutel fütterst; wenn Sie sie aus einer Tüte zurück in die Tube gießen, werden sie nicht in der gleichen Reihenfolge sein (weil sie alle in einer Tüte vermischt wurden).

Verwandte Themen