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

时间:2012-09-01 17:33:00

标签: 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

6 个答案:

答案 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)

     

根据iterablefunction返回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