my_list1 = [30,34,56]
my_list2 = [29,500,43]
¿Cómo verifico si todos los valores en la lista son> = 30? my_list1
debería funcionar y my_list2
no debería.
Lo único que se me ocurrió hacer fue:
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
Actualización 2016:
En retrospectiva, después de tratar con conjuntos de datos más grandes donde la velocidad realmente importa y utilizar numpy
... haría esto:
>>> 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
También puedes hacer algo como:
len([*filter(lambda x: x >= 30, my_list1)]) > 0
boolean
variable asignada es local a la función (ya que no hay unaglobal
anotación apropiada ), y 2)boolean = 0
es una asignación , no una comparación.my_list1
tiene un valor que no está por encima de 30. En cambio, es igual a 30. ¿Debería ser 31 en su lugar, o está probando un valor mayor o igual a 30 aquí?Respuestas:
Usa la
all()
función con una expresión generadora:>>> 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
Tenga en cuenta que esta prueba para valores mayores o iguales a 30, de lo contrario
my_list1
tampoco pasaría la prueba.Si quisiera hacer esto en una función, usaría:
def all_30_or_up(ls): for i in ls: if i < 30: return False return True
Por ejemplo, tan pronto como encuentre un valor que pruebe que hay un valor por debajo de 30, regresa
False
y regresaTrue
si no encontró evidencia en contrario.De manera similar, puede usar la
any()
función para probar si al menos 1 valor coincide con la condición.fuente
all_30_or_up
overall
? ¿No deberíaall
dejar de consumir el iterador tan pronto como se encuentre un negativo? Sería bastante tonto de lo contrario, ¿no?... ¿alguna razón por la que no puedas usar
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
No sé si esto es exactamente lo que quieres, pero técnicamente, esto es lo que pediste ...
fuente
all
cortocircuitos, por lo que es mucho más rápido si la lista no califica. Pero si la lista es de más de 30,min
puede ser más rápido. Probé con dos listas de 1000 elementos de enteros aleatorios, una llena conrandom.randint(0, 100)
(fallando) y otra llena conrandom.randint(30, 100)
. El usomin
tomó un poco menos de la mitad del tiempo en la lista 30-100. Peroall
tomó alrededor del 2% del tiempo que lomin
hizo en la lista 0-100, por lo que probablemente gane a menos que las listas fallidas sean muy raras.min
sale un poco más rápido: 0.25s para 10000 repeticiones en lugar de 0.32s paraall
. Entonces, cuál es más rápido depende de la naturaleza de los datos, como era de esperar.Hay una función incorporada
all
:all (x > limit for x in my_list)
Siendo límite el valor mayor al que deben ser todos los números.
fuente
my_list1
debería ser la pruebaTrue
, es casi seguro que la prueba debería ser>= 30
, no> 30
.Puede utilizar
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'
Tenga en cuenta que esto incluye todos los números iguales a 30 o superiores, no estrictamente superiores a 30.
fuente
my_list1
debería ser la pruebaTrue
, es casi seguro que la prueba debería ser>= 30
, no> 30
.>= 30
parece intencionada.El ganador general entre el uso de np.sum, np.min y todo parece ser np.min en términos de velocidad para matrices grandes:
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)
(Necesito poner la definición np.array dentro de la función; de lo contrario, la función np.min recuerda el valor y no vuelve a realizar el cálculo cuando se prueba la velocidad con timeit)
El rendimiento de "all" depende mucho de cuándo se encuentra el primer elemento que no satisface los criterios, el np.sum necesita hacer un poco de operaciones, el np.min es el más ligero en términos de cálculos en el caso general .
Cuando los criterios se cumplen casi de inmediato y el bucle todo sale rápido, la función all gana solo un poco sobre 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
Pero cuando "todos" deben pasar por todos los puntos, definitivamente es mucho peor, y el np.min gana:
>>> %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
Pero usando
puede ser muy útil si uno quiere saber cuántos valores están por debajo de x.
fuente
Puedes hacer lo siguiente:
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()
Esto devolverá los valores mayores que 30 como Verdadero y los valores menores como falso.
fuente
Escribo esta función
def larger(x, than=0): if not x or min(x) > than: return True return False
Entonces
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
La lista vacía en min () generará ValueError. Así que agregué
if not x
en condición.fuente