使用Python对包含"无"的列表求和

Sam*_*Sam 31 python sum

基本上我的问题是你有一个包含'无'的列表你将如何尝试检索列表的总和.下面是我尝试的一个例子,它不起作用,我收到错误: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
Run Code Online (Sandbox Code Playgroud)

Ale*_*yev 39

你可以使用filter功能

>>> sum(filter(None, [1,2,3,None]))
6
Run Code Online (Sandbox Code Playgroud)

从评论更新

通常filter用法是filter(func, iterable),但None作为第一个参数传递是一个特殊情况,在Python文档中描述.引用:

如果function为None,则假定为identity函数,即删除所有可迭代的false元素.

  • 对于那些不知道的人(比如我)可能有用:*"如果`function`是'None`,则假定为identity函数,即删除所有'iterable`的false的元素."*([文档](http://docs.python.org/library/functions.html#filter)) (2认同)
  • 注意每个虚假元素都会被过滤:`list(filter(None, [0, 1, 2, None, False, True])) # = [1, 2, True]` (2认同)

Mar*_*ers 9

None使用filter以下方法在求和之前删除(和零)元素:

>>> k = sum(filter(None, chain.from_iterable(my_list)))
>>> k
20
Run Code Online (Sandbox Code Playgroud)

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

filter(function, iterable)

iterable根据function返回true的元素构造一个列表.iterable可以是序列,支持迭代的容器,也可以是迭代器.如果iterable是字符串或元组,则结果也具有该类型; 否则它总是一个列表.如果是Nonefunction,则假定为identity函数,即删除所有可迭代的false元素.

注意,这filter(function, iterable)相当于[item for item in iterable if function(item)]if函数不是None,[item for item in iterable if item]如果函数是None.


Bre*_*arn 5

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

sum(x if x is not None else 0 for x in chain.from_iterable(my_list))
Run Code Online (Sandbox Code Playgroud)

  • 您也可以删除“无”值,因为“0”也不会占总和。 (3认同)

Tim*_*ker 5

另一个建议是:

from itertools import chain
k = sum(x for x in chain.from_iterable(my_list) if x)
Run Code Online (Sandbox Code Playgroud)