Utilisation de sum
avec une expression génératrice filtrée est le moyen le plus simple d'additionner un sous-ensemble d'une séquence :
positive_tally = sum(x for x in seq if x > 0)
negative_tally = sum(x for x in seq if x < 0)
En les combinant en un seul negpos
serait assez facile, mais probablement inutile à moins que vous ne fassiez cela à plusieurs endroits différents.
Par curiosité, j'ai décidé de faire une comparaison de temps réel entre l'approche par expression de générateur et l'approche simple for
boucle :
code1 = """
data = [-5,5,6,-8,9]
def negpos(seq):
neg, pos = 0, 0
for x in seq:
if x >= 0:
pos += x
else:
neg += x
return neg, pos
"""
code2 = """
data = [-5,5,6,-8,9]
def negpos(seq):
neg = sum(x for x in seq if x < 0)
pos = sum(x for x in seq if x > 0)
return neg, pos
"""
command = "negpos(data)"
timer1 = timeit.Timer(command, code1)
timer2 = timeit.Timer(command, code2)
timer1.repeat()
timer2.repeat()
Sur mon système, l'interface dédiée for
s'avère être environ deux fois plus rapide (ce n'est pas particulièrement surprenant, puisque la boucle est exécutée deux fois avec l'approche basée sur le générateur, mais il est toujours intéressant de le confirmer).