a = [1,2,3,4,5]
b = [1,3,5,6]
c = a and b
print c
tatsächliche Leistung: [1,3,5,6]
erwartete Leistung:[1,3,5]
Wie können wir eine boolesche UND-Operation (Listenschnittstelle) für zwei Listen erreichen?
python
arrays
intersection
csguy11
quelle
quelle
a and b
wie die folgende Aussage aus der Dokumentation funktioniert, die es erwähnt: " Der Ausdruck wirdx and y
zuerst ausgewertetx
; wenn erx
falsch ist, wird sein Wert zurückgegeben; andernfallsy
wird er ausgewertet und der resultierende Wert wird zurückgegeben. "Antworten:
Wenn die Reihenfolge nicht wichtig ist und Sie sich keine Gedanken über Duplikate machen müssen, können Sie die festgelegte Schnittmenge verwenden:
quelle
a = [1,1,2,3,4,5]
undb = [1,1,3,5,6]
dann der Schnittpunkt ist,[1,1,3,5]
aber nach der obigen Methode wird es nur einen geben,1
dh[1, 3, 5]
wie wird es dann geschrieben?intersection
wird allgemein zu verstehen gesetzt basiert. Sie suchen nach einem etwas anderen Tier - und müssen dies möglicherweise manuell tun, indem Sie jede Liste sortieren und die Ergebnisse zusammenführen - und Dups beim Zusammenführen beibehalten.Die Verwendung von Listenverständnissen ist für mich ziemlich offensichtlich. Ich bin mir nicht sicher über die Leistung, aber zumindest bleiben die Dinge Listen.
[x for x in a if x in b]
Oder "alle x-Werte in A, wenn der X-Wert in B ist".
quelle
b
einen Satz und Sie werden O (n)Wenn Sie die größere der beiden Listen in eine Menge konvertieren, können Sie den Schnittpunkt dieser Menge mit einer beliebigen iterierbaren Methode ermitteln, indem Sie
intersection()
:quelle
list(set(a) & set(b))
Machen Sie ein Set aus dem größeren:
Dann,
wird tun, was Sie wollen (Beibehalten
b
der Bestellung, nichta
der - kann nicht unbedingt beide beibehalten ) und es schnell tun . (Die Verwendungif x in a
als Bedingung für das Listenverständnis würde ebenfalls funktionieren und die Notwendigkeit des Erstellens vermeiden_auxset
, aber leider wäre es für Listen mit beträchtlicher Länge viel langsamer).Wenn Sie möchten, dass das Ergebnis sortiert wird, anstatt die Reihenfolge der Listen beizubehalten, ist dies möglicherweise noch besser:
quelle
Hier ist ein Python 2 / Python 3-Code, der Timing-Informationen für listenbasierte und satzbasierte Methoden zum Ermitteln des Schnittpunkts zweier Listen generiert.
Die reinen Listenverständnisalgorithmen sind O (n ^ 2), da
in
auf einer Liste eine lineare Suche erfolgt. Die satzbasierten Algorithmen sind O (n), da die Mengenrecherche O (1) und die Mengenerstellung O (n) ist (und die Konvertierung einer Menge in eine Liste ebenfalls O (n) ist). Für ausreichend große n sind die satzbasierten Algorithmen schneller, aber für kleine n machen die Overheads beim Erstellen der Menge (n) sie langsamer als die reinen Listenkompensationsalgorithmen.Ausgabe
Erstellt mit einem 2-GHz-Single-Core-Computer mit 2 GB RAM, auf dem Python 2.6.6 unter einer Debian-Version von Linux ausgeführt wird (Firefox läuft im Hintergrund).
Diese Zahlen sind nur eine grobe Richtlinie, da die tatsächlichen Geschwindigkeiten der verschiedenen Algorithmen durch den Anteil der Elemente in beiden Quellenlisten unterschiedlich beeinflusst werden.
quelle
Sollte wie ein Traum funktionieren. Und wenn Sie können, verwenden Sie Mengen anstelle von Listen, um zu vermeiden, dass sich all diese Typen ändern!
quelle
Ein funktionaler Weg kann mit
filter
undlambda
Bediener erreicht werden .Bearbeiten: Es filtert x heraus, das sowohl in Liste1 als auch in Liste vorhanden ist. Der eingestellte Unterschied kann auch erreicht werden mit:
Edit2: python3
filter
gibt ein Filterobjekt zurück und kapselt es mitlist
zurück, um die Ausgabeliste zurückzugeben.quelle
list(filter(lambda x:x in list1, list2))
, um es als Liste zu erhalten.Dies ist ein Beispiel, wenn Sie benötigen. Jedes Element im Ergebnis sollte so oft angezeigt werden, wie es in beiden Arrays angezeigt wird.
quelle
Es könnte spät sein, aber ich dachte nur, ich sollte es für den Fall teilen, dass Sie es manuell tun müssen (show work - haha) ODER wenn alle Elemente so oft wie möglich erscheinen müssen oder wenn es auch eindeutig sein muss .
Bitte beachten Sie, dass auch Tests dafür geschrieben wurden.
quelle
Wenn Sie mit Booleschem UND Elemente meinen, die in beiden Listen angezeigt werden, z. B. Schnittpunkte, sollten Sie sich Pythons
set
undfrozenset
Typen ansehen .quelle
Sie können auch einen Zähler verwenden! Die Reihenfolge wird nicht beibehalten, es werden jedoch die Duplikate berücksichtigt:
quelle