Sum une liste qui contient 'None' en utilisant Python
fondamentalement, ma question Est de dire que vous avez une liste contenant 'aucun' comment essaieriez-vous de récupérer la somme de la liste. Voici un exemple que j'ai essayé qui ne fonctionne pas et je reçois l'erreur:TypeError: unsupported operand type(s) for +: 'int' and 'NoneType'. Merci
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 réponses
Vous pouvez utiliser filter function
>>> sum(filter(None, [1,2,3,None]))
6
mise à Jour à partir des commentaires
typiquement filter utilisation filter(func, iterable), mais le passage None comme premier argument est un cas spécial, décrit dans Python docs. Le cite:
si la fonction est None, la fonction d'identité est supposée, c'est-à-dire que tous les éléments itérables qui sont faux sont supprimés.
Supprimer None (et zéro) éléments avant de sommation à l'aide de filter:
>>> k = sum(filter(None, chain.from_iterable(my_list)))
>>> k
20
voir pourquoi cela fonctionne, voir le documentation pour filter:
filter(function, iterable)construisez une liste à partir des éléments de
iterablepourfunctionrenvoie la valeur true.iterablepeut être soit une séquence, un récipient qui supporte l'itération, ou un itérateur. Si iterable est une chaîne ou un tuple, le résultat a aussi ce type; sinon c'est toujours une liste. Si la fonction estNone, la fonction d'identité est supposée, c'est-à-dire que tous les éléments itérables qui sont faux sont supprimés.Notez que
filter(function, iterable)est équivalent à[item for item in iterable if function(item)]si la fonction n'est pasNoneet[item for item in iterable if item]si la fonction estNone.
une autre suggestion:
from itertools import chain
k = sum(x for x in chain.from_iterable(my_list) if x)
en Supposant que vous souhaitez traiter None en tant que zéro, un moyen simple est
sum(x if x is not None else 0 for x in chain.from_iterable(my_list))
vous avez toujours l'option d'écrire simplement la boucle que vous voulez:
k = 0
for sublist in my_list:
for val in sublist:
if val is not None:
k += val
mais ça ne fait certainement pas de mal de savoir à propos de filter soit.
explicitement, cela équivaut à filtrer:
k = sum([x for x in chain.from_iterable(my_list) if x])
cela m'évite de me souvenir d'une autre fonction. :P