J'essaie de compter les choses qui ne sont pas None
, mais je veux que False
et les zéros numériques soient également acceptés. Logique inversée: je veux tout compter sauf ce qui a été explicitement déclaré comme None
.
Seulement le 5ème élément n'est pas inclus dans le décompte:
>>> list = ['hey', 'what', 0, False, None, 14]
>>> print(magic_count(list))
5
Je sais que ce n'est pas un comportement normal de Python, mais comment puis-je remplacer le comportement de Python?
Jusqu'ici, j'ai fondé des personnes suggérant que a if a is not None else "too bad"
, mais cela ne fonctionne pas.
J'ai aussi essayé isinstance
, mais sans succès.
Utilisez simplement sum
pour vérifier si chaque objet is not None
est True
ou False
so 1 ou 0.
lst = ['hey','what',0,False,None,14]
print(sum(x is not None for x in lst))
Ou en utilisant filter
avec python2:
print(len(filter(lambda x: x is not None, lst))) # py3 -> Tuple(filter(lambda x: x is not None, lst))
Avec python3, il existeNone.__ne__()
qui ignore uniquement les valeurs de None et filtre sans la nécessité d’un lambda.
sum(1 for _ in filter(None.__ne__, lst))
L’avantage de sum
est qu’il évalue paresseusement un élément à la fois au lieu de créer une liste complète de valeurs.
Sur une note de côté, évitez d’utiliser list
comme nom de variable car elle ombrage le python list
.
Deux manières:
Un, avec une expression de liste
len([x for x in lst if x is not None])
Deux, comptez les Nones et soustrayez-les de la longueur:
len(lst) - lst.count(None)
lst = ['hey','what',0,False,None,14]
print sum(1 for i in lst if i != None)
J'ai récemment publié une bibliothèque contenant une fonction iteration_utilities.count_items
(ok, en fait 3 parce que j'utilise aussi les helpers is_None
et is_not_None
) à cette fin:
>>> from iteration_utilities import count_items, is_not_None, is_None
>>> lst = ['hey', 'what', 0, False, None, 14]
>>> count_items(lst, pred=is_not_None) # number of items that are not None
5
>>> count_items(lst, pred=is_None) # number of items that are None
1
Utilisez numpy
import numpy as np
list = np.array(['hey', 'what', 0, False, None, 14])
print(sum(list != None))