嗯,有幾個選項,首選1是使用dict.get()
:
# 1
sum(dct.get(k, 0) for k in lst)
# 2
sum(dct[k] for k in lst if k in dct)
另一個選項是在迭代之前過濾lst
:
sum(dct[k] for k in filter(lambda i: i in dct, lst))
你可以過濾列表上使用reduce function作爲替代sum
:
reduce(lambda a, k: a + dct[k], filter(lambda i: i in dct, lst))
現在,讓我們找到最快的方式與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 get: 16.725695848464966
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 sum and condition: 9.4715681076
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))
# Via reduce: 19.9522120953
所以最快的選項是通過如內聲明,總結項目發生器表達
sum(dct[k] for k in lst if k in dct) # Via sum and condition: 9.4715681076
好Luc k!
您不能在生成器表達式中使用'try'。爲什麼不使用'dct.get(k)',如果找不到密鑰,會給你'None'而不是錯誤?在沒有找到密鑰的情況下(例如,它應該計爲「0」),代碼的正確行爲是什麼? – jonrsharpe
如果找不到密鑰,則應繼續使用其餘密鑰。 (我會更新我的描述來解釋這種情況 - 感謝您注意到這一點) – Yannis