Суммируйте список, содержащий "None", используя Python
В основном, мой вопрос заключается в том, что у вас есть список, содержащий "Нет", как бы вы попытались получить сумму списка. Ниже приведен пример, который я попробовал, который не работает, и я получаю сообщение об ошибке: TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'
. Благодаря
def sumImport(self):
my_list = [[1,2,3,None],[1,2,3],[1,1],[1,1,2,2]]
k = sum(chain.from_iterable(my_list))
return k
Ответы
Ответ 1
Вы можете использовать функцию filter
>>> sum(filter(None, [1,2,3,None]))
6
Обновлено из комментариев
Обычно filter
используется filter(func, iterable)
, но передача None
в качестве первого аргумента является частным случаем, описанным в документах Python. Цитирование:
Если функция None, предполагается функция идентификации, то есть все элементы итерабельных, которые являются ложными, удаляются.
Ответ 2
Удалите элементы None
(и ноль) перед суммированием с помощью filter
:
>>> k = sum(filter(None, chain.from_iterable(my_list)))
>>> k
20
Чтобы понять, почему это работает, см. документацию для filter
:
filter(function, iterable)
Создайте список из тех элементов iterable
, для которых function
возвращает значение true. iterable
может быть либо последовательностью, либо контейнером, поддерживающим итерацию, либо итератором. Если iterable является строкой или кортежем, результат также имеет этот тип; в противном случае это всегда список. Если функция None
, предполагается функция идентификации, то есть все элементы итерабельности, которые являются ложными, удаляются.
Обратите внимание, что filter(function, iterable)
эквивалентно [item for item in iterable if function(item)]
, если функция не None
и [item for item in iterable if item]
, если функция None
.
Ответ 3
Другое предложение:
from itertools import chain
k = sum(x for x in chain.from_iterable(my_list) if x)
Ответ 4
Предполагая, что вы хотите рассматривать None
как ноль, простой способ
sum(x if x is not None else 0 for x in chain.from_iterable(my_list))
Ответ 5
У вас всегда есть возможность просто написать нужный цикл:
k = 0
for sublist in my_list:
for val in sublist:
if val is not None:
k += val
Но это, конечно, не больно знать о filter
.
Ответ 6
Явно, это эквивалентно фильтру:
k = sum([x for x in chain.from_iterable(my_list) if x])
Это спасает меня от запоминания другой функции.: P