基本上我的问题是你有一个包含'无'的列表你将如何尝试检索列表的总和。下面是我尝试的一个不起作用的示例,我收到错误: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
答案 0 :(得分:35)
您可以使用filter
功能
>>> sum(filter(None, [1,2,3,None]))
6
从评论中更新
通常filter
用法为filter(func, iterable)
,但将None
作为第一个参数传递是一种特殊情况,在Python docs中有所描述。引用:
如果function为None,则假定为identity函数,即删除所有可迭代的false元素。
答案 1 :(得分:9)
使用None
:
filter
(和零)元素
>>> k = sum(filter(None, chain.from_iterable(my_list)))
>>> k
20
要了解其工作原理,请参阅documentation for filter
:
filter(function, iterable)
根据
iterable
为function
返回true的元素构造一个列表。iterable
可以是序列,支持迭代的容器,也可以是迭代器。如果iterable是字符串或元组,则结果也具有该类型;否则它总是一个列表。如果function为None
,则假定为identity函数,即删除所有可迭代的false元素。请注意,如果函数不是
filter(function, iterable)
,则[item for item in iterable if function(item)]
等同于None
,如果函数是[item for item in iterable if item]
,则None
等同于{{1}}。
答案 2 :(得分:5)
另一个建议:
from itertools import chain
k = sum(x for x in chain.from_iterable(my_list) if x)
答案 3 :(得分:4)
假设您想将None
视为零,一种简单的方法是
sum(x if x is not None else 0 for x in chain.from_iterable(my_list))
答案 4 :(得分:0)
你总是可以选择只写你想要的循环:
k = 0
for sublist in my_list:
for val in sublist:
if val is not None:
k += val
但是,了解filter
也不会有什么坏处。
答案 5 :(得分:0)
显然,这相当于过滤器:
k = sum([x for x in chain.from_iterable(my_list) if x])
这使我免于记住另一个功能。 :P