web-dev-qa-db-ja.com

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
34
Sam

filter関数を使用できます

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

コメントから更新

通常、filterの使用法はfilter(func, iterable)ですが、最初の引数としてNoneを渡すことは、 Python docs で説明されている特殊なケースです。引用:

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

44
Alexey Kachayev

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

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

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

filter(function, iterable)

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

関数がNoneでない場合、filter(function, iterable)[item for item in iterable if function(item)]と同等であり、関数がNoneの場合は_[item for item in iterable if item]_と同等であることに注意してください。

9
Mark Byers

別の提案:

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

Noneをゼロとして扱いたいとすると、簡単な方法は

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

あなたはいつもあなたが望むループを書くだけのオプションがあります:

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

しかし、filterについて知っていても問題ありません。

0
Jason Orendorff

明示的に、これはフィルターと同等です。

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

これにより、別の機能を覚える必要がなくなります。 :P

0
Taro Sato