Vérifier si toutes les valeurs de la liste sont supérieures à un certain nombre
my_list1 = [30,34,56]
my_list2 = [29,500,43]
Comment puis-je vérifier si toutes les valeurs de la liste sont >= 30? my_list1
doit travailler et my_list2
ne devrait pas.
La seule chose que je pouvais penser était:
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
Mise à jour de 2016:
Avec le recul, après avoir fait face à de plus grands ensembles de données où la vitesse qui importe réellement et en utilisant numpy
...je voudrais faire cela:
>>> 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
Vous pouvez aussi faire quelque chose comme:
len([*filter(lambda x: x >= 30, my_list1)]) > 0
- Une des questions générales à savoir: 1) la assignés
boolean
variable est locale à la fonction (comme il n'est pas appropriéglobal
annotation), et 2)boolean = 0
est une mission, pas une comparaison. - Notez que votre
my_list1
a une valeur qui n'est pas au-dessus de 30. Il est plutôt égal à 30. Si le 31 au lieu de cela, ou êtes-vous tester pour supérieur ou égal à 30 ici?
InformationsquelleAutor O.rka | 2013-11-26
Vous devez vous connecter pour publier un commentaire.
Utiliser le
all()
function avec un générateur d'expression:Noter que ces tests pour plus de ou égale à 30, sinon
my_list1
ne passerait pas le test.Si vous vouliez faire cela dans une fonction, vous pouvez utiliser:
par exemple, dès que vous trouvez une valeur qui prouve qu'il y a un valeur en dessous de 30, vous revenez
False
, et retourTrue
si vous avez trouvé aucune preuve du contraire.De même, vous pouvez utiliser le
any()
function pour tester si au moins 1 valeur correspond à la condition.all_30_or_up
surall
? Ne devrait pasall
aussi arrêter de consommer de l'itérateur dès que négatif a été trouvé? Serait tout à fait stupide, autrement, ne serait-il pas?...aucune raison pourquoi vous ne pouvez pas utiliser
min()
?Je ne sais pas si c'est exactement ce que vous voulez, mais techniquement, c'est ce que vous avez demandé...
all
les courts-circuits, il est donc beaucoup plus rapide si la liste ne sont pas admissibles. Mais si la liste est tous les 30+,min
peut être plus rapide. J'ai testé avec deux de 1000 élément des listes d'entiers aléatoires, l'un rempli avecrandom.randint(0, 100)
(à défaut) et un rempli avecrandom.randint(30, 100)
. À l'aide demin
a pris un peu moins de la moitié du temps sur le 30-100 liste. Maisall
a pris environ 2% du temps quemin
fait sur le 0-100 liste, de sorte qu'il remporte probablement à défaut, à moins que les listes sont très rares.min
sort un peu plus vite - 0,25 s pour 10000 répétitions plutôt que de 0,32 s pourall
. Donc, ce qui est plus rapide dépend de la nature des données, comme vous le souhaitez.Il y a une fonction builtin
all
:Étant la limite de la valeur au-delà de laquelle tous les nombres doivent être.
my_list1
doit testerTrue
, le test doit presque certainement être>= 30
, pas> 30
.Vous pouvez utiliser
all()
:Noter que cela inclut tous les nombres égaux à 30 ou plus, ne sont pas strictement au-dessus de 30.
my_list1
doit testerTrue
, le test doit presque certainement être>= 30
, pas> 30
.>= 30
semble destiné.Le vainqueur entre l'utilisation de la np.somme, np.min, et tout semble être np.min en termes de vitesse pour les grands tableaux:
(j'ai besoin de mettre de la np.définition de tableau à l'intérieur de la fonction, sinon de la np.min fonction mémorise la valeur et de ne pas faire le calcul à nouveau lors des essais de vitesse avec timeit)
La performance de "tout" dépend très fortement lorsque le premier élément qui ne satisfait pas le critère est trouvé, le np.la somme doit faire un peu d'opérations, de la np.min est le plus léger en termes de calculs dans le cas général.
Lorsque le critère est presque immédiatement rencontré, et tous les boucle rapide, l'ensemble des fonctions est de gagner juste un peu plus de np.min:
Mais quand "tout" doit passer par tous les points, il est certainement bien pire, et de la np.min victoires:
Mais en utilisant
peut être très utile est l'un veut savoir comment beaucoup de valeurs sont en dessous de x.
Vous pouvez effectuer les opérations suivantes:
Ce sera le retour de la que des valeurs supérieures à 30 comme Vrai, et les valeurs qui sont plus petits comme faux.
J'écris cette fonction
Puis
Liste vide sur min() va raise ValueError. J'ai donc ajouté
if not x
dans la condition.