Kürzlich habe ich festgestellt, dass beim Konvertieren von a list
in set
die Reihenfolge der Elemente geändert und nach Zeichen sortiert wird.
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 passiert dies?
- Wie kann ich Set-Operationen (insbesondere Set Difference) ausführen, ohne die ursprüngliche Reihenfolge zu verlieren?
unique = list(dict.fromkeys([1, 2, 1]).keys())
. Dies funktioniert, weildict
die Einfügereihenfolge jetzt beibehalten wird.Antworten:
A
set
ist eine ungeordnete Datenstruktur, sodass die Einfügereihenfolge nicht beibehalten wird.Dies hängt von Ihren Anforderungen ab. Wenn Sie eine normale Liste haben und einige Elemente entfernen möchten, während die Reihenfolge der Liste beibehalten wird, können Sie dies mit einem Listenverständnis tun:
Wenn Sie eine Datenstruktur benötigen, die sowohl schnelle Mitgliedschaftstests als auch die Beibehaltung der Einfügereihenfolge unterstützt , können Sie die Schlüssel eines Python-Wörterbuchs verwenden, das ab Python 3.7 garantiert die Einfügereihenfolge beibehält:
b
muss hier nicht wirklich bestellt werden - Sie können auch eine verwendenset
. Beachten Sie, dassa.keys() - b.keys()
die eingestellte Differenz als zurückgegeben wirdset
, sodass die Einfügereihenfolge nicht beibehalten wird.In älteren Versionen von Python können Sie
collections.OrderedDict
stattdessen Folgendes verwenden:quelle
None
ist eine Sprache garantiert Singleton. In CPython sind die tatsächlichen Kosten nur der Zeiger (obwohl diese Kosten immer vorhanden sind, aber für ein Diktat können Sie fastNone
andere Singletons oder gemeinsame Referenzen als "kostenlos" betrachten), also ein Maschinenwort, wahrscheinlich 8 Bytes auf modernen Computern . Aber ja, es ist nicht so platzsparend wie ein Set sein könnte.dict.fromkeys([1, 2, 1]).keys()
weil reguläredict
s auch die Reihenfolge beibehalten.In Python 3.6,es gibt eine andere Lösung für Python 2 und 3:set()
jetzt sollte die Reihenfolge halten, aberquelle
x.index
Aufruf eine lineare Suche durchgeführt wird. Wenn Sie mit quadratischer Komplexität zufrieden sind, gibt es überhaupt keinen Grund, a zu verwendenset
.set()
ist nicht in Python 3.6 bestellt, auch nicht als Implementierungsdetail, Sie denken andict
sint
oft selbst stapeln. Stackoverflow.com/questions/45581901/…x=[1,2,-1,20,6,210]
, es zu einem Set zu machen. Sie werden sehen, dass es überhaupt nicht bestellt ist und in Python 3.6 getestet wurde.Bei der Beantwortung Ihrer ersten Frage handelt es sich bei einem Satz um eine Datenstruktur, die für Satzoperationen optimiert ist. Wie eine mathematische Menge erzwingt oder behält sie keine bestimmte Reihenfolge der Elemente bei. Das abstrakte Konzept einer Menge erzwingt keine Reihenfolge, daher ist die Implementierung nicht erforderlich. Wenn Sie einen Satz aus einer Liste erstellen, kann Python die Reihenfolge der Elemente an die Anforderungen der internen Implementierung anpassen, die für einen Satz verwendet wird, der Satzoperationen effizient ausführen kann.
quelle
Entfernen Sie Duplikate und behalten Sie die Reihenfolge durch die unten stehende Funktion bei
Überprüfen Sie diesen Link
quelle
In der Mathematik gibt es Mengen und geordnete Mengen (Osets).
In Python werden nur Mengen direkt implementiert. Wir können Osets mit regulären Diktiertasten ( 3.7+ ) emulieren .
Gegeben
Code
Demo
Replikate werden entfernt, die Einfügereihenfolge bleibt erhalten.
Set-ähnliche Operationen an Diktiertasten.
Einzelheiten
Hinweis: Eine ungeordnete Struktur schließt geordnete Elemente nicht aus. Vielmehr ist eine aufrechterhaltene Bestellung nicht garantiert. Beispiel:
Man kann erfreut sein zu entdecken, dass eine Liste und ein Multiset (mset) zwei weitere faszinierende mathematische Datenstrukturen sind:
Zusammenfassung
* Ein Multiset kann indirekt mit
collections.Counter()
einer diktartigen Abbildung von Multiplizitäten (Zählungen) emuliert werden .quelle
Wie in anderen Antworten angegeben, sind Mengen Datenstrukturen (und mathematische Konzepte), die die Elementreihenfolge nicht beibehalten -
Durch die Verwendung einer Kombination aus Sätzen und Wörterbüchern ist es jedoch möglich, dass Sie das erreichen, was Sie möchten - versuchen Sie es mit folgenden Ausschnitten:
quelle
Aufbauend auf Svens Antwort fand ich die Verwendung von Sammlungen. OrderedDict hat mir so geholfen, das zu erreichen, was Sie wollen, und ich kann dem Diktat weitere Elemente hinzufügen:
Wenn Sie Elemente hinzufügen möchten, diese aber dennoch wie ein Set behandeln möchten, können Sie Folgendes tun:
Und Sie können eine Operation wie z.keys () für das Diktat ausführen und das Set erhalten:
quelle
list(z.keys())
, um die Listenausgabe zu erhalten.Eine Implementierung des oben genannten Konzepts mit der höchsten Punktzahl bringt es zurück zu einer Liste:
Getestet (kurz) auf Python 3.6 und Python 2.7.
quelle
Wenn Ihre beiden Anfangslisten eine kleine Anzahl von Elementen enthalten, für die Sie eine Differenzoperation festlegen möchten, anstatt
collections.OrderedDict
die Implementierung zu verwenden, die die Implementierung kompliziert und weniger lesbar macht, können Sie Folgendes verwenden:Die zeitliche Komplexität ist nicht so gut, aber ordentlich und leicht zu lesen.
quelle
Es ist interessant, dass die Leute immer das Problem der realen Welt benutzen, um Witze über die Definition in der theoretischen Wissenschaft zu machen.
Wenn set die Reihenfolge hat, müssen Sie zuerst die folgenden Probleme herausfinden. Wenn Ihre Liste doppelte Elemente enthält, wie sollte die Reihenfolge sein, wenn Sie sie in ein Set verwandeln? Was ist die Reihenfolge, wenn wir zwei Mengen vereinen? Wie ist die Reihenfolge, wenn wir zwei Mengen mit unterschiedlicher Reihenfolge auf denselben Elementen schneiden?
Außerdem ist set bei der Suche nach einem bestimmten Schlüssel viel schneller, was bei der Set-Operation sehr gut ist (und deshalb benötigen Sie ein Set, aber keine Liste).
Wenn Sie sich wirklich für den Index interessieren, behalten Sie ihn einfach als Liste bei. Wenn Sie dennoch die Set-Operation für die Elemente in vielen Listen ausführen möchten, erstellen Sie am einfachsten ein Wörterbuch für jede Liste mit denselben Schlüsseln im Set sowie einen Listenwert, der den gesamten Index des Schlüssels in der ursprünglichen Liste enthält.
quelle
Hier ist eine einfache Möglichkeit, dies zu tun:
quelle