bool Wert einer Liste in Python
was ist der beste Weg, um wiederum eine Liste in bool-Wert? Ich bin auf der Suche nach etwas wie:
return eval_bool(my_list)
Ich habe einen custom container, in dem ich die Umsetzung der __nonzero__
Methode, die funktionieren soll wie dieses:
if self.my_list:
return True
return False
Aber ist es pythonic genug? 🙂 Trotzdem, ich bin neugierig, wie Python interpretiert den Wert aus der Liste in der if
Aussage, denn dieser code funktioniert anders:
return my_list == True
J.
InformationsquelleAutor galapah | 2012-03-24
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Verwenden Sie einfach:
Dem wertet es als Python "truthiness" und gibt einen echten Boolean.
Während
bool
verwendet werden kann, ist es mehr Pythonic zu rufenif my_list:
lassen und Python festzustellen, obmy_list
bewerten zuTrue
oderFalse
.Warum ist
if my_list: return True\nreturn False
mehr pythonic alsreturn bool(my_list)
?Es ist einfach nicht üblich zu schreiben
if bool(my_list):
wenn Sie können auch schreibenif my_list:
. In den meisten Fällen müssen Sie nur überprüfen, ob die Liste leer ist oder nicht, Sie nicht wirklich brauchen, die einen booleschen Wert. Python kann sehen, dass Sie der Auswertung einer if-Anweisung und ruftbool()
selbst. Wenn Sie wirklich dann einen booleschen Wert (zum Beispiel, wie die Ausgabe) dannbool(my_list)
Ordnung ist natürlich.das Ziel ist hier nicht zu haben bedingte Logik überhaupt, sondern um die Rückkehr ein boolescher Wert.
InformationsquelleAutor Keith
Wenn
len(my_list) == 0
es zurückgegeben wird, wiefalse
, sonst ist estrue
. Es ist völlig pythonic zu schreiben:welche, obwohl es zurückgegeben wird, wie eine ganze Zahl ergibt
true
für nicht-null-Längen, und andernfalls false.es funktioniert, aber es verstößt gegen pep 8: Sequenzen (strings, Listen, Tupel), die Tatsache, dass leere Sequenzen sind falsch. Ja: wenn nicht, seq: wenn seq: Nein: if len(seq) if not len(seq)
InformationsquelleAutor fraxel
Können Sie ternären "if" - operator. Google sagt, es unterstützt seit 2,5
True
undFalse
sind weltweit gebaut-ins, die geladen werden müssen von der built-in-namespace (der beinhaltet ein paar Wörterbucheinträge, einen für Globale Variablen, dann eine Sekunde in der gelieferten, wenn Sie nicht gefunden), keine literalen Konstanten. In Python 3, Sie sind Literale Konstanten, die nur eine billigeLOAD_CONST
Anweisung zum laden (welche kocht unten zu einer einzelnen C-level-array-lookup), so ist dies eine der zwei schnellsten Möglichkeiten, um zu konvertieren, um einbool
(der andere wirdnot not your_list
).InformationsquelleAutor chelovekbeznika
99,9% der Zeit, die Leistung spielt keine Rolle, so einfach
bool(my_list)
als Keith schlägt.In den Fällen, in denen die Leistung hat gleich, obwohl, die Natur
bool
bedeutet, es ist eigentlich Recht langsam, zumindest auf die Referenz CPython-interpreter. Sie gehen durch verallgemeinerte Funktion rufen Sie Wege, um verallgemeinerte Konstruktor Wege, um verallgemeinerte argument-parsing für 0-1 Argumente (und in alle, aber die neuesten Versionen von Python, die überprüfung für die keyword-Argumenten), um schließlich nur Inkrement als Verweiszähler auf ein singleton und gibt es zurück.Können Sie sehen, wie viel diese Kosten mit
ipython
microbenchmarks (auf meinem Windows x64 3.6.3 bauen):Kann es nicht offensichtlich sein, aber auch auf meinem relativ schwachen laptop, 117-118 Nanosekunden genau zu bestimmen truthiness ist ein bisschen viel. Zum Glück gibt es ein paar andere Optionen. Einer ist, um Missbrauch syntax laufen über einen dedizierten Pfad für truthiness Auswertung (von hier an werde ich nur testen Sie die leeren
list
, die timings sind im Grunde identisch oder so):Das ist eine große Verbesserung; es dauert etwa ein Fünftel der Zeit. Auf Python 3, mit
True if l else False
funktioniert auch mit der gleichen Geschwindigkeit, aber es ist viel langsamer alsnot not
auf Python 2, woTrue
undFalse
geschützt sind nicht-Literale, nur built-in-Namen, die müssen dynamisch geladen werden, jedes mal.Immer noch, es ist nicht perfekt; manchmal müssen ein callable, z.B. zum umwandeln einer Menge von Werten zu
bool
über eine callback-Funktion (z.B. mitmap
). Zum Glück, dieoperator
- Modul hat Sie bedeckt mit- operator.Wahrheit
; es ist zwar immer noch aufrufbar, mit allem Aufwand, der dazugehört, es ist kein Konstruktor, dauert es genau ein argument (nicht 0-1), und es nicht erlaubt, keyword-Argumente, von denen alle Kosten überraschend viel auf die Referenz CPython-interpreter. Also, wenn Sie nicht verwenden können, implizite truthiness-Tests oder syntax-basierte Konvertierung mitnot not
, und Sie müssen noch die Geschwindigkeit, dieoperator.truth
hat Sie bedeckt:Doppelt so lang wie
not not
, aber wenn Sie es mit built-ins, nennen Sie es wiederholt (wiemap
) zu können, schieben Sie die ganze Arbeit auf der C-Ebene, die Vermeidung von byte-code-Ausführung komplett, noch dass es ein Gewinn ist, und es ist immer noch weit unter der Hälfte so teuer, wiebool()
selbst.Erneut auf meinen früheren Punkt aber: 99,9% der Zeit, die Leistung spielt keine Rolle, so dass nur
bool(my_list)
als Keith schlägt. Ich nur erwähne dies, weil ich hatte mal ein Szenario, wo das boolean-Konvertierung war wirklich der heißeste Punkt in meinem code (verifiziert durch profiling), und implizite truthiness-Tests (auch nicht konvertieren, nur die Rücksendung derlist
mit dem Anrufer zu tunif myfunc():
) Rasiert 30% Rabatt auf die Laufzeit und die Rückkehrnot not
deslist
immer noch fast 20% ersparnis.InformationsquelleAutor ShadowRanger