gpt4 book ai didi

python - 过滤 Python 生成器表达式中的值

转载 作者:太空狗 更新时间:2023-10-30 00:31:30 25 4
gpt4 key购买 nike

我有一个字典 dct,如果它们对应的键存在于指定列表 lst 中,我希望对它的每个值求和。

目前我使用的代码是:

sum(dct[k] for k in lst)

在上面的生成器表达式中,我想处理 KeyError 以防在字典中找不到列表中的键。我似乎无法找到如何实现(语法方面)try-except 方法,或者 if-else 此生成器表达式中的方法。

如果列表中的某个键在字典中找不到,那么它应该继续获取其他值求和的最终结果不应受到任何缺失键的影响。如果不存在任何键,则总和的结果应为零。

最佳答案

好吧,选项很少,首选是使用 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

所以最快的选择是通过生成器表达式中的 if 语句对项目求和

sum(dct[k] for k in lst if k in dct) # Via sum and condition: 9.4715681076

祝你好运!

关于python - 过滤 Python 生成器表达式中的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37772551/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com