基本的に私の質問は、「なし」を含むリストがあるとしたら、リストの合計を取得するにはどうすればよいでしょうか。以下は私が試した例で、機能せずエラーが発生します: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 docs で説明されている特殊なケースです。引用:
FunctionがNoneの場合、恒等関数が想定されます。つまり、falseであるiterableのすべての要素が削除されます。
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]
_と同等であることに注意してください。
別の提案:
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