In [27]: map( lambda f,p: f.match(p), list(patterns.itervalues()), vatids )
Out[27]: [None, <_sre.SRE_Match object at 0xb73bfdb0>, None]
Die Liste kann ganz None
oder teilweise eine re.Match-Instanz sein. Welchen Liner-Check kann ich auf der zurückgegebenen Liste durchführen, um mir mitzuteilen, dass alle Inhalte vorhanden sind None
?
Antworten:
all(v is None for v in l)
wird zurückgegeben,
True
wenn alle Elemente vonl
sindNone
Beachten Sie, dass dies
l.count(None) == len(l)
viel schneller ist, aber erfordert, dass es sichl
um eine tatsächlichelist
und nicht nur eine iterierbare handelt.quelle
None
Auftreten auf? Warum ist der zweite Ausdruck auch schneller? Mach für mich keinen Sinn.all
stoppt, wenn das erste falsche Objekt gefunden wird. Die zweite ist zumindest unter CPython schneller, da die Methode.count
für die Objekte deslist
Typs in C integriert und geschrieben ist und im Gegensatz zum Generator kein Interpreter in die Schleife über die Liste eingebunden ist.all(v is None for v in l)
wird true zurückgeben, wenn Sie0
anstelle vonNone
not any(my_list)
Gibt zurück,
True
wenn alle Elemente vonmy_list
falsch sind.Bearbeiten : Da Übereinstimmungsobjekte immer wahr und
None
falsch sind, ergibt dies das gleiche Ergebnis wieall(x is None for x in my_list)
für den vorliegenden Fall. Wie in der Antwortany()
von Gnibbler gezeigt , ist die Verwendung bei weitem die schnellere Alternative.quelle
True
,None
bewerten zuFalse
. Darüber hinaus wird nur 0 als falsch angesehen, nicht "numerische Werte kleiner als 1".re.match()
denen entwederNone
oder ein Übereinstimmungsobjekt sind, sodass es einfach keine Rolle spielt, dass diese Lösung fehlschlagen würde0
. Ich habe einige Erklärungen hinzugefügt, um dies klarer zu machen.Da Match-Objekte niemals als falsch ausgewertet werden, ist es in Ordnung und viel schneller, sie nur zu verwenden
not any(L)
$ python -m timeit -s"L=[None,None,None]" "all( v is None for v in L )" 100000 loops, best of 3: 1.52 usec per loop $ python -m timeit -s"L=[None,None,None]" "not any(L)" 1000000 loops, best of 3: 0.281 usec per loop $ python -m timeit -s"L=[None,1,None]" "all( v is None for v in L )" 100000 loops, best of 3: 1.81 usec per loop $ python -m timeit -s"L=[None,1,None]" "not any(L)" 1000000 loops, best of 3: 0.272 usec per loop
quelle
Oder ein bisschen komisch, aber:
a = [None, None, None] set(a) == set([None])
ODER:
if [x for x in a if x]: # non empty list #do something
EDITIERT:
def is_empty(lVals): if not lVals: return True for x in lVals: if x: return False return True
quelle
is_empty(my_list)
wärereturn not any(my_list)
. Zumindest sollten Sie die ersten beiden Zeilen weglassen.is_all_none = lambda L: not len(filter(lambda e: not e is None, L)) is_all_none([None,None,'x']) False is_all_none([None,None,None]) True
quelle
lambda
hier anstelle der einfachen verwenden würdendef
.Ich habe es geschafft, einen Ansatz zu finden
map
, der noch nicht gegeben wurdetl; dr
def all_none(l): return not any(map(None.__ne__, l)) all_none([None, None, None]) # -> True all_none([None, None, 8]) # -> False
Erläuterung
Die Verwendung von
None.__ne__
ist etwas seltsamer als man auf den ersten Blick erwarten würde. Diese Methode gibt einNotImplementedType
Objekt zurück, wenn etwas angegeben wird, das nicht None ist.Sie würden hoffen, dass
NotImplemented
dies einFalse
Ersatz sein würde , aber es ist auch wahr! Dies bedeutet, dass die VerwendungNone.__eq__
in einer Sammlung für alles Thruthy-Werte erzeugt.list(map(None.__eq__, [None, None, 8])) # -> [True, True, NotImplemented] all(list(map(None.__eq__, [None, None, 8]))) # -> True
Aus den Python-Dokumenten :
Stattdessen
None.__ne__
gibtFalse
für alleNone
Elemente, und einNotImplementedType
Objekt für etwas anderes:list(map(None.__ne__, [None, None, 8])) # -> [False, False, NotImplemented]
Mit diesem können Sie überprüfen , ob
any
Elemente nicht ,None
die angezeigt werden könnenTrue
. Ich stelle mir das gerne als zwei getrennte Methoden vor, wenn das bei der mentalen Negationsgymnastik hilft.def contains_truthy(l): return any(map(None.__ne__, l)) def all_none(l): return not contains_truthy(l)
Ich habe damit kein Benchmarking durchgeführt, aber wie von anderen in diesem Thread erwähnt,
not any
werden schnelle Ergebnisse erzielt.quelle