Mit der in Python integrierten Funktion any(iterable)
können Sie schnell überprüfen, ob bool(element)
es sich True
um einen iterierbaren Typ handelt.
>>> l = [None, False, 0]
>>> any(l)
False
>>> l = [None, 1, 0]
>>> any(l)
True
Aber gibt es in Python eine elegante Art und Weise, die den gegenteiligen Effekt erzielen könnte any(iterable)
? Wenn dies der Fall ist, bool(element) is False
kehren Sie True
wie im folgenden Beispiel zurück:
>>> l = [True, False, True]
>>> any_false(l)
>>> True
python
python-3.x
iterable
Ekeyme Mo.
quelle
quelle
all
RenditenTrue
auf leere iterable “ - natürlich tut es . Hast du etwas anderes erwartet?Antworten:
Es gibt auch die
all
Funktion, die das Gegenteil von dem tut, was Sie wollen. Sie gibt zurück,True
ob alle vorhanden sindTrue
undFalse
ob welche vorhanden sindFalse
. Deshalb können Sie einfach tun:not all(l)
quelle
all
gibt True bei leer iterable zurück.False
für[]
die richtige Antwort ist; was dieser Code aber das OP geben müsste.all(...)
Sie können jederzeitTrue
zur Argumentliste hinzufügen , ohne die Ausgabe zu ändern.True
ist ein "neutrales Element" (genau wie 0 für die Addition, 1 für die Multiplikation sind neutrale Elemente). Deshalb gibt es leereall()
RetourenTrue
. Fürany()
das neutrale Element istFalse
.any
erwartet, da alles integriert ist. Der Ansatz von Deceze ist jedoch allgemeiner anwendbar.∃x: ¬x
entspricht¬(∀x: x)
. Siehe hierSchreiben Sie einen Generatorausdruck, der Ihren benutzerdefinierten Zustand testet. Sie sind nicht nur an den Standard- Wahrheitstest gebunden :
any(not i for i in l)
quelle
any(bool(i) == False for i in l)
ist es besser. Recht?None == False
istFalse
, aber das will ich nicht.bool(None) == False
istTrue
not i for i in l
wäre wahrscheinlich am besten.==
den Vergleich mit Booleschen Werten. Verwenden Sie einfach den bloßen Wert, z.if value: ...
. Wenn Sie jedoch unbedingt prüfen müssen, ob ein Objekt eher ein Boolescher als ein wahrheitsgemäßer Wert ist, verwenden Sieis
. Andernfalls können Sie unerwartete Ergebnisse erzielen - z.1 == True
ist wahr, aber2 == True
falsch.not all(l)
all
wird kurzschließen, sobald es trifftFalse
; Ich gehe davon aus, dass der fest codierte C-Stil, nach demFalse
not i
Nun, die Implementierung von
any
ist gleichbedeutend mit:def any(iterable): for element in iterable: if element: return True return False
Schalten Sie einfach die Bedingung von
if element
aufif not element
:def reverse_any(iterable): for element in iterable: if not element: return True return False
Ja, dies nutzt natürlich nicht die Geschwindigkeit der integrierten Funktionen
any
oderall
wie die anderen Antworten, aber es ist eine gut lesbare Alternative.quelle
any
undall
sind im Allgemeinen mystifizieren , um neue Benutzer an ihrer rauen Implementierung sucht im Allgemeinen hilft.Du kannst tun:
>>> l = [True, False, True] >>> False in map(bool, l) True
Denken Sie daran, dass
map
in Python 3 ein Generator ist. Für Python 2 möchten Sie wahrscheinlich verwendenimap
Mea Culpa: Nach dem Timing ist die von mir angebotene Methode zweifellos die langsamste
Das schnellste ist
not all(l)
odernot next(filterfalse(bool, it), True)
was nur eine alberne itertools Variante ist. Verwenden Sie die Jack Aidleys- Lösung .Timing-Code:
from itertools import filterfalse def af1(it): return not all(it) def af2(it): return any(not i for i in it) def af3(iterable): for element in iterable: if not element: return True return False def af4(it): return False in map(bool, it) def af5(it): return not next(filterfalse(bool, it), True) if __name__=='__main__': import timeit for i, l in enumerate([[True]*1000+[False]+[True]*999, # False in the middle [False]*2000, # all False [True]*2000], # all True start=1): print("case:", i) for f in (af1, af2, af3, af4, af5): print(" ",f.__name__, timeit.timeit("f(l)", setup="from __main__ import f, l", number=100000), f(l) )
Ergebnisse:
case: 1 af1 0.45357259700540453 True af2 4.538436588976765 True af3 1.2491040650056675 True af4 8.935278153978288 True af5 0.4685744970047381 True case: 2 af1 0.016299808979965746 True af2 0.04787631600629538 True af3 0.015038023004308343 True af4 0.03326922300038859 True af5 0.029870904982089996 True case: 3 af1 0.8545824179891497 False af2 8.786235476000002 False af3 2.448748088994762 False af4 17.90895140200155 False af5 0.9152941330103204 False
quelle