まあ、いくつかのオプションがあり、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)
オプションの1つは、それを反復する前にlst
をフィルタリングすることです。
sum(dct[k] for k in filter(lambda i: i in dct, lst))
そして、あなたはsum
の代替としてフィルタリングされたリストにreduce functionを使用することができます。
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
だから、最速のオプションは、内のif文を経由してアイテムを合計することですジェネレータ表現
sum(dct[k] for k in lst if k in dct) # Via sum and condition: 9.4715681076
グッドリックk!
ジェネレータ式では 'try'を使用できません。 'dct.get(k)'を使わない方がいいでしょう。キーが見つからなければエラーではなく 'None'を返します。キーが見つからない場合(たとえば、「0」と数えられるはずです)、コードの正しい動作は何ですか? – jonrsharpe
キーが見つからない場合は、残りのキーを使用してキーを続行する必要があります。 (私はこの事件を説明するために私の記述を更新する - これに気付いてくれてありがとう) – Yannis