my_list1 = [30,34,56]
my_list2 = [29,500,43]
Wie überprüfe ich, ob alle Werte in der Liste> = 30 sind? my_list1
sollte funktionieren und my_list2
sollte nicht.
Das einzige, woran ich denken konnte, war:
boolean = 0
def func(ls):
for k in ls:
if k >= 30:
boolean = boolean + 1
else:
boolean = 0
if boolean > 0:
print 'Continue'
elif boolean = 0:
pass
Update 2016:
Im Nachhinein numpy
würde ich Folgendes tun , nachdem ich mich mit größeren Datensätzen befasst habe, bei denen Geschwindigkeit tatsächlich wichtig ist, und ...
>>> my_list1 = [30,34,56]
>>> my_list2 = [29,500,43]
>>> import numpy as np
>>> A_1 = np.array(my_list1)
>>> A_2 = np.array(my_list2)
>>> A_1 >= 30
array([ True, True, True], dtype=bool)
>>> A_2 >= 30
array([False, True, True], dtype=bool)
>>> ((A_1 >= 30).sum() == A_1.size).astype(np.int)
1
>>> ((A_2 >= 30).sum() == A_2.size).astype(np.int)
0
Sie könnten auch so etwas tun:
len([*filter(lambda x: x >= 30, my_list1)]) > 0
boolean
Variable ist lokal für die Funktion (da keine entsprechendeglobal
Anmerkung vorhanden ist ) und 2)boolean = 0
ist eine Zuweisung , kein Vergleich.my_list1
hat einen Wert, der ist nicht über 30 , dass es stattdessen gleich 30 Should 31 statt sein, oder testen Sie für mehr als oder gleich 30 hier?Antworten:
Verwenden Sie die
all()
Funktion mit einem Generatorausdruck:>>> my_list1 = [30, 34, 56] >>> my_list2 = [29, 500, 43] >>> all(i >= 30 for i in my_list1) True >>> all(i >= 30 for i in my_list2) False
Beachten Sie, dass dieser Test größer oder gleich 30 ist, andernfalls
my_list1
würde der Test auch nicht bestanden.Wenn Sie dies in einer Funktion tun möchten, verwenden Sie:
def all_30_or_up(ls): for i in ls: if i < 30: return False return True
Sobald Sie beispielsweise einen Wert finden, der beweist, dass ein Wert unter 30 liegt, kehren Sie zurück
False
und kehren zurück,True
wenn Sie keine gegenteiligen Beweise gefunden haben.Ebenso können Sie mit der
any()
Funktion testen, ob mindestens 1 Wert der Bedingung entspricht.quelle
all_30_or_up
überall
? Sollte nichtall
auch aufhören, den Iterator zu verbrauchen, sobald ein Negativ gefunden wurde? Wäre sonst ziemlich dumm, nicht wahr?... einen Grund, warum Sie nicht verwenden können
min()
?def above(my_list, minimum): if min(my_list) >= minimum: print "All values are equal or above", minimum else: print "Not all values are equal or above", minimum
Ich weiß nicht, ob das genau das ist, was Sie wollen, aber technisch gesehen haben Sie darum gebeten ...
quelle
all
Kurzschlüsse, daher ist es viel schneller, wenn die Liste nicht qualifiziert ist. Aber wenn die Liste alle 30+ ist,min
kann schneller sein. Ich habe mit zwei 1000-Element-Listen zufälliger Ganzzahlen getestet, eine mitrandom.randint(0, 100)
(fehlgeschlagen) und eine mitrandom.randint(30, 100)
. Die Verwendungmin
auf der 30-100-Liste dauerte etwas weniger als die Hälfte der Zeit. Esall
dauerte jedoch ungefähr 2% der Zeit,min
die auf der 0-100-Liste verstrichen ist, sodass es wahrscheinlich gewinnt, es sei denn, fehlerhafte Listen sind sehr selten.min
erzwingen , das sich in der Mitte der Liste befindet, wird etwas schneller ausgeführt - 0,25 s für 10000 Wiederholungen anstelle von 0,32 s fürall
. Was also schneller ist, hängt erwartungsgemäß von der Art der Daten ab.Es gibt eine eingebaute Funktion
all
:all (x > limit for x in my_list)
Begrenzen Sie den Wert, der größer ist als alle Zahlen.
quelle
my_list1
sollte testenTrue
, sollte der Test mit ziemlicher Sicherheit>= 30
nicht sein> 30
.Sie können verwenden
all()
:my_list1 = [30,34,56] my_list2 = [29,500,43] if all(i >= 30 for i in my_list1): print 'yes' if all(i >= 30 for i in my_list2): print 'no'
Beachten Sie, dass dies alle Zahlen umfasst, die gleich 30 oder höher sind und nicht unbedingt über 30 liegen.
quelle
my_list1
sollte testenTrue
, sollte der Test mit ziemlicher Sicherheit>= 30
nicht sein> 30
.>= 30
scheint aber beabsichtigt.Der Gesamtsieger zwischen der Verwendung von np.sum, np.min und all scheint in Bezug auf die Geschwindigkeit für große Arrays np.min zu sein:
N = 1000000 def func_sum(x): my_list = np.random.randn(N) return np.sum(my_list < x )==0 def func_min(x): my_list = np.random.randn(N) return np.min(my_list) >= x def func_all(x): my_list = np.random.randn(N) return all(i >= x for i in my_list)
(Ich muss die Definition von np.array in die Funktion einfügen, andernfalls merkt sich die Funktion np.min den Wert und führt die Berechnung nicht erneut durch, wenn die Geschwindigkeit mit der Zeit getestet wird.)
Die Leistung von "all" hängt sehr davon ab, wann das erste Element gefunden wird, das die Kriterien nicht erfüllt. Die np.sum muss einige Operationen ausführen. Die np.min ist im allgemeinen Fall die leichteste in Bezug auf Berechnungen .
Wenn die Kriterien fast sofort erfüllt sind und die All-Schleife schnell beendet wird, gewinnt die All-Funktion nur geringfügig über np.min:
>>> %timeit func_sum(10) 10 loops, best of 3: 36.1 ms per loop >>> %timeit func_min(10) 10 loops, best of 3: 35.1 ms per loop >>> %timeit func_all(10) 10 loops, best of 3: 35 ms per loop
Aber wenn "alle" alle Punkte durchgehen müssen, ist es definitiv viel schlimmer und die np.min gewinnt:
>>> %timeit func_sum(-10) 10 loops, best of 3: 36.2 ms per loop >>> %timeit func_min(-10) 10 loops, best of 3: 35.2 ms per loop >>> %timeit func_all(-10) 10 loops, best of 3: 230 ms per loop
Aber mit
kann sehr nützlich sein, wenn man wissen möchte, wie viele Werte unter x liegen.
quelle
Sie können Folgendes tun:
def Lists(): my_list1 = [30,34,56] my_list2 = [29,500,43] for element in my_list1: print(element >= 30) for element in my_list2: print(element >= 30) Lists()
Dadurch werden die Werte, die größer als 30 sind, als True und die Werte, die kleiner als false sind, zurückgegeben.
quelle
Ich schreibe diese Funktion
def larger(x, than=0): if not x or min(x) > than: return True return False
Dann
print larger([5, 6, 7], than=5) # False print larger([6, 7, 8], than=5) # True print larger([], than=5) # True print larger([6, 7, 8, None], than=5) # False
Eine leere Liste auf min () löst ValueError aus. Also habe ich
if not x
in Zustand hinzugefügt .quelle