簡體   English   中英

使用 Python 對包含“無”的列表求和

[英]Sum a list which contains 'None' using 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

您可以使用filter功能

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

從評論更新

通常, filter使用是filter(func, iterable) ,但是將第一個參數作為None傳遞是一種特殊情況,在Python文檔中有描述。 引用:

如果function為None,則假定為identity函數,即刪除所有可迭代的false元素。

使用filter在求和之前刪除None (和零)元素:

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

要了解其工作原理,請參閱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

另一個建議是:

from itertools import chain
k = sum(x for x in chain.from_iterable(my_list) if x)

假設你想將None視為零,一個簡單的方法就是

sum(x if x is not None else 0 for x in chain.from_iterable(my_list))

你總是可以選擇只寫你想要的循環:

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

但是,了解filter當然也沒有什么壞處。

顯然,這相當於過濾器:

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

這使我免於記住另一個功能。 :P

只需使用 sum 和 map:

sum(map(lambda x: x or 0, [1,2,3,None])) 
# 6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM