Python - Überprüfen, ob eine Liste eine Untermenge der anderen ist
Brauche ich, um zu überprüfen, ob eine Liste ist eine Untermenge des anderen - ein boolean zurückgeben, ist alles, was ich Suche.
Testet die Gleichheit auf der kleineren Liste nach einer Kreuzung der Schnellste Weg, dies zu tun?
Die Leistung ist von größter Bedeutung, da die Menge der Datensätze, die verglichen werden.
Das hinzufügen weiterer Fakten, basierend auf den Diskussionen:
- Wird entweder von den Listen werden die gleichen für viele tests?
Es hat als eines von Ihnen ist eine statische lookup-Tabelle - Muss es sein, eine Liste?
Tut es nicht - die statische lookup-Tabelle kann alles sein, am besten führt.
Das dynamische ist ein dict, von denen wir extrahieren die Schlüssel zum führen Sie eine statische lookup auf.
Was wäre die optimale Lösung für das Szenario?
InformationsquelleAutor der Frage IUnknown | 2013-05-16
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Die performante Funktion Python bietet für diese ist set.issubset. Es gibt ein paar Einschränkungen, die machen es unklar, ob es die Antwort auf deine Frage, aber.
Einer Liste enthalten möglicherweise Elemente mehrfach und hat einen spezifischen Auftrag. Set nicht. Eine hohe Leistung setzt die Arbeit an hashable nur Objekte.
Sind Sie gefragt Teilmenge oder Folge (das heißt, Sie brauchen eine string-Suche-Algorithmus)? Entweder die Listen werden auch für viele tests? Was sind die Datentypen in der Liste enthalten? Und für diese Angelegenheit, muss es eine Liste?
Ihren anderen Beitrag schneiden Sie ein dict und Liste gemacht, die Typen klarer und bekam eine Empfehlung zur Anwendung von Wörterbuch-Schlüssel-Ansichten für Ihre set-wie funcitonality. In diesem Fall war es bekannt, um zu arbeiten, weil Wörterbuch-Tasten Verhalten sich wie eine Reihe (so viel, so dass wir je hatten-sets in Python, die wir verwendet, Wörterbücher). Man fragt sich, wie sich das Problem hab weniger spezifisch in drei Stunden.
InformationsquelleAutor der Antwort Yann Vernier
InformationsquelleAutor der Antwort Yulan Liu
Erklärung: Generator erstellen Boolesche Werte, indem die Schleife durch die Liste
one
überprüfung, ob das Element in der Listetwo
.all()
zurückTrue
wenn jedes Element ist truthy, sonstFalse
.Es ist auch ein Vorteil, dass
all
False zurück auf die erste Instanz von einem element fehlt, anstatt Sie zu verarbeiten jeden Artikel.InformationsquelleAutor der Antwort voidnologo
Vorausgesetzt, die Elemente sind hashable
Wenn Sie kümmern sich nicht um doppelte Elemente zB.
[1, 2, 2]
und[1, 2]
dann verwenden Sie einfach:.issubset
der Schnellste Weg, es zu tun. Überprüfen Sie die Länge vor der Prüfungissubset
wird sich nicht verbessern Geschwindigkeit, weil Sie immer noch O(N + M) Elemente Durchlaufen und prüfen.InformationsquelleAutor der Antwort jamylak
Ich weiß, das ist spät, aber wollte nur aktualisieren Sie die Antwort mit dem, was für mich gearbeitet
(Python 3)
Cheers.
InformationsquelleAutor der Antwort Mohit
Versuchen bitweise UND
Nicht profiliert es noch nicht.
InformationsquelleAutor der Antwort hjbolide
Eine weitere Lösung wäre die Verwendung einer
intersection
.Den Schnittpunkt der Sätze enthalten würde, der
set one
(ODER)
InformationsquelleAutor der Antwort Vikram S
Wenn list1 ist in Liste 2:
(x in two for x in one)
erzeugt eine Liste vonTrue
.wenn wir eine
set(x in two for x in one)
hat nur ein element (True).InformationsquelleAutor der Antwort Vikram S
Mir verzeihen, wenn ich zu spät zu der party. 😉
Um zu überprüfen, ob eine
set A
ist Teilmenge vonset B
Python
hatA.issubset(B)
undA <= B
. Es funktioniert aufset
nur und funktioniert Super ABER die Komplexität der internen Umsetzung ist unbekannt. Referenz: https://docs.python.org/2/library/sets.html#set-objectsKam ich mit einen Algorithmus, um zu überprüfen, ob
list A
ist eine Teilmenge vonlist B
mit folgenden Bemerkungen.sort
beiden Listen den ersten, bevor vergleichen von Elementen zu qualifizierenTeilmenge.
break
dieloop
wenn der Wert des element der zweiten ListeB[j]
größer ist als der Wert des element der ersten ListeA[i]
.last_index_j
zu startenloop
überlist B
wo Sie zuletzt aufgehört haben. Es hilft zu vermeiden, ab-Vergleiche vom Beginn derlist B
(das ist, wie Sie vielleicht erraten, unnötig, zu startenlist B
ausindex 0
im nachfolgendeniterations
.)Komplexität
O(n ln n)
jeweils für die Sortierung der beiden Listen undO(n)
für die Prüfung für die Teilmenge.O(n ln n) + O(n ln n) + O(n) = O(n ln n)
.Code hat viele
print
Anweisungen, um zu sehen, was Los ist bei jederiteration
desloop
. Diese sollen die für das Verständnisnur.
Prüfen Sie, ob eine Liste ist Teilmenge der anderen Liste
Ausgabe
InformationsquelleAutor der Antwort Hamza Rashid
Set-Theorie ist ungeeignet für die Listen, da Duplikate wird im Ergebnis falsche Antworten mit-set-Theorie.
Beispiel:
keine Bedeutung hat. Ja, es gibt eine falsche Antwort, aber dies ist nicht korrekt, da die set-Theorie ist nur der Vergleich: 1,3,5-versus-1,3,4,5. Sie müssen alle Duplikate.
Stattdessen zählen Sie jedes vorkommen von jedem Element und eine, die größer als gleich zu überprüfen. Dies ist nicht sehr teuer, weil es nicht mit O(N^2) Operationen und erfordern keine schnellen Sorte.
Dann läuft das bekommen Sie:
InformationsquelleAutor der Antwort Eamonn Kenny
Folgende code prüft, ob ein gegebener Satz ist eine "echte Teilmenge" einer anderen Gruppe
InformationsquelleAutor der Antwort Leo Bastin
In python 3.5 können Sie eine
[*set()][index]
zu erhalten das element. Es ist viel langsamer Lösung als andere Methoden.oder nur mit len und festlegen
InformationsquelleAutor der Antwort Vikram S
Wenn Sie gefragt werden, ob eine Liste "enthalten" in einer anderen Liste dann:
Wenn Sie gefragt werden, ob jedes element in listA hat die gleiche Anzahl der übereinstimmenden Elemente in listB versuchen:
InformationsquelleAutor der Antwort DevPlayer