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)渡すのは特殊なケースであり、 Pythonのドキュメントで説明されています。引用:None

関数がNoneの場合、恒等関数が想定されます。つまり、falseであるiterableのすべての要素が削除されます。

于 2012-09-01T17:34:40.823 に答える
10

Noneを使用して合計する前に、要素を削除(およびゼロ)しfilterます。

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

これが機能する理由を確認するには、次のドキュメントをfilter参照してください。

filter(function, iterable)

iterabletrueをfunction返す要素からリストを作成します。iterableシーケンス、反復をサポートするコンテナ、またはイテレータのいずれかです。iterableが文字列またはタプルの場合、結果にもそのタイプが含まれます。それ以外の場合は常にリストです。関数がの場合None、恒等関数が想定されます。つまり、falseであるiterableのすべての要素が削除されます。

関数がそうでない場合、および関数がである場合filter(function, iterable)と同等であることに注意してください。[item for item in iterable if function(item)]None[item for item in iterable if item]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

明示的には、これは filter と同等です:

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 に答える