Как подсчитать количество вхождений "Нет" в списке?
Я пытаюсь подсчитать вещи, которые не являются 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))