Well, there are several options, it is preferable to use dict.get():
# 1
sum(dct.get(k, 0) for k in lst)
# 2
sum(dct[k] for k in lst if k in dct)
Also one of the options is filtering lstbefore repeating it:
sum(dct[k] for k in filter(lambda i: i in dct, lst))
And you can use the reduce function in the filtered list as an alternative sum:
reduce(lambda a, k: a + dct[k], filter(lambda i: i in dct, lst))
Now find a quick approach with timeit :
from timeit import timeit
import random
lst = range(0, 10000)
dct = {x:x for x in lst if random.choice([True, False])}
via_sum = lambda:(sum(dct.get(k, 0) for k in lst))
print("Via sum and get: %s" % timeit(via_sum, number=10000))
via_sum_and_cond = lambda:(sum(dct[k] for k in lst if k in dct))
print("Via sum and condition: %s" % timeit(via_sum_and_cond, number=10000))
via_reduce = lambda:(reduce(lambda a, k: a + dct[k], filter(lambda i: i in dct, lst)))
print("Via reduce: %s" % timeit(via_reduce, number=10000))
Thus, the fastest option is to sum the elements through the if statement in the generator expression
sum(dct[k] for k in lst if k in dct)
Luck!
source
share