48

基本上我的问题是说您有一个包含“无”的列表,您将如何尝试检索列表的总和。下面是我试过的一个例子,它不起作用,我得到了错误: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
4

7 回答 7

63

你可以使用filter函数

>>> sum(filter(None, [1,2,3,None]))
6

从评论更新

通常filter用法是filter(func, iterable),但作为第一个参数传递None是一种特殊情况,在Python 文档中进行了描述。报价:

如果 function 为 None,则假定恒等函数,即移除 iterable 中所有为 false 的元素。

于 2012-09-01T17:34:40.823 回答
10

None使用求和之前删除(和零)元素filter

>>> k = sum(filter(None, chain.from_iterable(my_list)))
>>> k
20

要了解其工作原理,请参阅以下文档filter

filter(function, iterable)

从那些返回 true 的元素构造一个iterable列表functioniterable可以是序列、支持迭代的容器或迭代器。如果 iterable 是字符串或元组,则结果也具有该类型;否则它总是一个列表。如果 function 是None,则假定恒等函数,即所有 iterable 为 false 的元素都被删除。

请注意,这filter(function, iterable)相当于[item for item in iterable if function(item)]if function is notNone[item for item in iterable if item]if function is None

于 2012-09-01T17:35:05.850 回答
6

另一个建议:

from itertools import chain
k = sum(x for x in chain.from_iterable(my_list) if x)
于 2012-09-01T17:41:03.137 回答
5

假设您想将None其视为零,一种简单的方法是

sum(x if x is not None else 0 for x in chain.from_iterable(my_list))
于 2012-09-01T17:34:34.220 回答
3

明确地说,这等效于过滤器:

k = sum([x for x in chain.from_iterable(my_list) if x])

这使我免于记住另一个功能。:P

于 2012-09-01T18:23:01.943 回答
1

你总是可以选择只写你想要的循环:

k = 0
for sublist in my_list:
    for val in sublist:
        if val is not None:
            k += val

但知道这filter两者当然也没有什么坏处。

于 2012-09-01T17:41:07.420 回答
0

只需使用 sum 和 map:

sum(map(lambda x: x or 0, [1,2,3,None])) 
# 6
于 2021-10-09T11:12:32.377 回答