Как подсчитать количество вхождений "Нет" в списке?

Я пытаюсь подсчитать вещи, которые не являются None, но я хочу, чтобы False и числовые нули принимались тоже. Реверсивная логика: я хочу считать все, кроме того, что явно объявлено как None.

Пример

Только 5-й элемент не включен в число:

>>> list = ['hey', 'what', 0, False, None, 14]
>>> print(magic_count(list))
5

Я знаю, что это не нормальное поведение Python, но как я могу переопределить поведение Python?

Что я пробовал

До сих пор я основывал людей на предположении, что a if a is not None else "too bad", но он не работает.

Я также пробовал isinstance, но не повезло.

Ответ 1

Просто используйте sum, проверяя, есть ли каждый объект is not None, который будет True или False так 1 или 0.

lst = ['hey','what',0,False,None,14]
print(sum(x is not None for x in lst))

Или используя filter с python2:

print(len(filter(lambda x: x is not None, lst))) # py3 -> tuple(filter(lambda x: x is not None, lst))

С python3 существует None.__ne__(), который будет игнорировать None и фильтровать без необходимости лямбда.

sum(1 for _ in filter(None.__ne__, lst))

Преимущество sum заключается в ленивом вычислении элемента за раз, а не в создании полного списка значений.

На стороне примечания избегайте использования list в качестве имени переменной, поскольку оно тени для python list.

Ответ 2

Два способа:

Один, с выражением списка

len([x for x in lst if x is not None])

Два, подсчитайте Nones и вычтите их из длины:

len(lst) - lst.count(None)

Ответ 3

lst = ['hey','what',0,False,None,14]
print sum(1 for i in lst if i != None)

Ответ 4

Недавно я выпустил библиотеку, содержащую функцию iteration_utilities.count_items (нормально, фактически 3, потому что я также использую помощники is_None и is_not_None) для этой цели:

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

Ответ 5

Используйте NumPy

import numpy as np

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