web-dev-qa-db-fra.com

Comment compter le nombre d'occurrences de `None` dans une liste?

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.

Exemple

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?

Ce que j'ai essayé

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.

13
Hrabal

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.

25

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)
9
RemcoGerlich
lst = ['hey','what',0,False,None,14]
print sum(1 for i in lst if i != None)
3
kvorobiev

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
0
MSeifert

Utilisez numpy

import numpy as np

list = np.array(['hey', 'what', 0, False, None, 14])
print(sum(list != None))
0
Rémi Baudoux