Подтвердить что ты не робот

Суммируйте список, содержащий "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
4b9b3361

Ответ 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