Ich versuche einen kurzen Weg zu finden, um festzustellen, ob eines der folgenden Elemente in einer Liste enthalten ist, aber mein erster Versuch funktioniert nicht. Neben dem Schreiben einer Funktion, um dies zu erreichen, können Sie auf kurze Weise überprüfen, ob sich eines von mehreren Elementen in einer Liste befindet.
>>> a = [2,3,4]
>>> print (1 or 2) in a
False
>>> print (2 or 1) in a
True
a = [1, 2] b = [3, 5, 2, 6, 8, 9] c = [3, 5, 6, 8, 1, 9] print( (1 and 2) in b ,(2 and 1) in b ,(1 and 2) in c ,(2 and 1) in c, sep='\n')
ist wahr falsch falsch falsch wahrAntworten:
Sowohl leere Listen als auch leere Mengen sind falsch, sodass Sie den Wert direkt als Wahrheitswert verwenden können.
quelle
any
kann früh zurückkehren, sobald es einenTrue
Wert findet - es muss nicht die ganze Liste zuerstAh, Tobias, du hast mich geschlagen. Ich habe an diese geringfügige Abweichung von Ihrer Lösung gedacht:
quelle
x in long for x in short
vsx in short for x in long
)a
undb
die gleiche Länge, max und min wird die am weitesten links Liste zurück, die das machtany()
Anruf auf beiden Seiten arbeitet über die gleiche Liste. Wenn Sie unbedingt die Länge überprüfen müssen, kehren Sie die Reihenfolge der Listen im zweiten Aufruf um :any(x in max(a, b, key=len) for x in (b, a, key=len))
.any(x in max(a, b, key=len) for x in min(b, a, key=len))
(verpasste die min).Vielleicht etwas fauler:
quelle
any
früh zurückkehren kann, während Ihre Version die gesamte Liste aus dem Verständnis erstellen muss, bevorany
sie verwendet werden kann. @ user89788 Antwort ist etwas besser, weil die doppelten Klammern unnötig sindÜberlegen Sie, was der Code tatsächlich sagt!
Das sollte es wahrscheinlich erklären. :) Python implementiert anscheinend "faul oder", was keine Überraschung sein sollte. Es führt es ungefähr so aus:
Im ersten Beispiel
x == 1
undy == 2
. Im zweiten Beispiel ist es umgekehrt. Aus diesem Grund werden je nach Reihenfolge unterschiedliche Werte zurückgegeben.quelle
Code Golf Version. Erwägen Sie die Verwendung eines Sets, wenn dies sinnvoll ist. Ich finde das lesbarer als ein Listenverständnis.
quelle
1 Zeile ohne Listenverständnis.
quelle
Das Beste, was ich mir vorstellen konnte:
quelle
In Python 3 können wir das Entpack-Sternchen verwenden. Gegeben zwei Listen:
Bearbeiten: Alkanens Vorschlag einbeziehen
quelle
Wenn Sie denken "prüfen, ob a in b ist", denken Sie an Hashes (in diesem Fall setzt). Der schnellste Weg besteht darin, die Liste, die Sie überprüfen möchten, zu hashen und dann jedes Element dort zu überprüfen.
Aus diesem Grund antwortet Joe Koberg schnell: Die Überprüfung der eingestellten Kreuzung ist sehr schnell.
Wenn Sie jedoch nicht viele Daten haben, kann das Erstellen von Sets Zeitverschwendung sein. Sie können also einen Satz der Liste erstellen und einfach jedes Element überprüfen:
Wenn die Anzahl der zu überprüfenden Elemente gering ist, kann der Unterschied vernachlässigbar sein. Aber überprüfen Sie viele Zahlen anhand einer großen Liste ...
Tests:
Geschwindigkeiten:
Die Methode, die durchweg schnell ist, besteht darin, einen Satz (aus der Liste) zu erstellen, aber der Schnittpunkt funktioniert bei großen Datenmengen am besten!
quelle
In einigen Fällen (z. B. eindeutige Listenelemente) können Set-Operationen verwendet werden.
Oder verwenden Sie set.isdisjoint () ,
quelle
Dies wird es in einer Zeile tun.
quelle
Ich habe einige der in anderen Antworten und Kommentaren genannten Lösungen gesammelt und dann einen Geschwindigkeitstest durchgeführt.
not set(a).isdisjoint(b)
Es stellte sich heraus, dass es das schnellste war, es verlangsamte sich auch nicht viel, als das Ergebnis warFalse
.Jeder der drei Läufe testet eine kleine Auswahl der möglichen Konfigurationen von
a
undb
. Die Zeiten sind in Mikrosekunden angegeben.quelle
Ich muss sagen, dass meine Situation möglicherweise nicht das ist, wonach Sie suchen, aber sie bietet möglicherweise eine Alternative zu Ihrem Denken.
Ich habe sowohl die set () - als auch eine beliebige () Methode ausprobiert, habe aber immer noch Probleme mit der Geschwindigkeit. Also erinnerte ich mich, dass Raymond Hettinger sagte, alles in Python sei ein Wörterbuch und benutze Dikt, wann immer du kannst. Das habe ich versucht.
Ich habe ein defaultdict mit int verwendet, um negative Ergebnisse anzuzeigen, und das Element in der ersten Liste als Schlüssel für die zweite Liste verwendet (konvertiert in defaultdict). Da Sie mit dict sofort nachschlagen können, wissen Sie sofort, ob dieses Element im defaultdict vorhanden ist. Ich weiß, dass Sie die Datenstruktur für Ihre zweite Liste nicht immer ändern können, aber wenn Sie dies von Anfang an können, ist es viel schneller. Möglicherweise müssen Sie list2 (größere Liste) in ein Standarddikt konvertieren, wobei key der potenzielle Wert ist, den Sie anhand einer kleinen Liste überprüfen möchten, und der Wert entweder 1 (Treffer) oder 0 (kein Treffer, Standard) ist.
quelle
Einfach.
quelle
a
in der Liste enthalten istb
.