Konvertieren einer Liste, um einen Satz verpasst-element, um
Vor kurzem habe ich bemerkt, dass wenn ich die Konvertierung einer list
zu set
Sie die Reihenfolge der Elemente geändert wird und sortiert nach Charakter.
Betrachten Sie dieses Beispiel:
x=[1,2,20,6,210]
print x
# [1, 2, 20, 6, 210] # the order is same as initial order
set(x)
# set([1, 2, 20, 210, 6]) # in the set(x) output order is sorted
Meine Fragen sind -
- Warum ist das passiert?
- Wie kann ich set-Operationen (insbesondere Satz Unterschied), ohne die ursprüngliche Reihenfolge?
- Warum wollen Sie nicht verlieren der ersten Ordnung, vor allem, wenn Sie tun-und set-Operationen? "Bestellung" ist ein sinnloses Konzept für sets, die nicht nur in Python, sondern in der Mathematik.
- Ja, "Ordnung ist ein sinnloses Konzept für Gruppen...in der Mathematik", aber ich habe echte Probleme in der Welt 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einen
set
ist eine ungeordnete Datenstruktur.Nicht mit einem
set
, sondernSammlungen.OrderedDict
:Beachten Sie, dass die Reihenfolge der
b
spielt keine Rolle, es könnte also sein iterierbar, aber es sollte ein durchsuchbar unterstützt O(1) - Mitgliedschaft, tests.Bearbeiten: Die Antwort oben wird davon ausgegangen, dass Sie in der Lage sein, zu erfüllen (bestellt) set-Operationen auf alle vorkommenden Kollektionen, insbesondere auch auf das Ergebnis einer früheren Betrieb gesetzt. Wenn dies nicht notwendig ist, können Sie einfach Listen für einige der Sammlungen und sets für andere, z.B.
Damit verliert die Ordnung der
b
, erlaubt keine schnelle Mitgliedschaft der tests aufa
und das Ergebnis. Sets ermöglichen eine schnelle Mitgliedschaft, tests, Listen, Ordnung zu halten. Wenn Sie diese Funktionen auf die gleiche Sammlung, dann verwenden Siecollections.OrderedDict
.In Python-3.6,gibt es eine andere Lösung für Python 2 und 3:set()
jetzt sollte halten Sie die Reihenfolge, aberx.index
aufgerufen wird, wird eine lineare Suche durchgeführt wird. Wenn Sie in Ordnung mit quadratischer Komplexität gibt es keinen Grund, eineset
in den ersten Platz.set()
ist nicht bestellt Python-3.6, auch nicht, als eine Implementierung detail, denken Sie andict
sint
s oft hash zu sich selbst stackoverflow.com/questions/45581901/...x=[1,2,-1,20,6,210]
und machen es zu einem set. Du wirst sehen, es bestellt nicht bei allen, getestet in Python 3.6.Beantwortung Ihrer ersten Frage, ein set ist eine Datenstruktur optimiert für den set-Operationen. Wie eine mathematische Menge, ist es nicht die Durchsetzung oder Aufrechterhaltung einer bestimmten Reihenfolge der Elemente. Das abstrakte Konzept der set nicht durchsetzen, um so die Umsetzung ist nicht erforderlich. Wenn Sie ein set erzeugen aus einer Liste, Python hat die Freiheit zum ändern der Reihenfolge der Elemente für die Bedürfnisse der internen Implementierung verwendet es für eine Gruppe, die in der Lage ist zum durchführen von Mengenoperationen effizient.
Laut anderen Antworten, die Sätze sind Daten-Strukturen (und mathematische Konzepte), die nicht die Erhaltung der element-Reihenfolge -
Jedoch durch die Verwendung einer Kombination von Mengen und Wörterbüchern, ist es möglich, dass Sie erreichen können, wathever Sie möchten - versuchen Sie es mit diesen snippets:
Gebäude auf Sven ' s Antwort fand ich unter Kollektionen.OrderedDict wie half mir, mich zu erreichen, was Sie wollen und lassen Sie mich fügen Sie weitere Elemente, um den dict:
Wenn Sie Elemente hinzufügen möchten, aber trotzdem behandeln Sie es wie einen Satz können Sie nur:
Sind, so können Sie eine operation wie z.- Tasten() auf der dict und Holen Sie sich das set:
list(z.keys())
um die Ausgabe der Liste.Einer Umsetzung der höchsten Punktzahl Konzept vor, das bringt Sie zurück zur Liste:
Getestet (nur kurz), auf Python 3.6 und Python 2.7.
In Fall müssen Sie eine kleine Anzahl der Elemente in Ihren ersten zwei Listen auf, die Sie wollen, zu tun, Unterschied zwischen Betrieb, anstatt
collections.OrderedDict
das erschwert die Umsetzung und macht es weniger lesbar, die Sie verwenden können:Seiner Zeit-Komplexität ist nicht so gut, aber es ist ordentlich und leicht zu Lesen.
Hier ist eine einfache Möglichkeit, es zu tun: