基于双字典实现Python单行布尔标记对应分值累加计算
单行计算风险属性总分的实现方案
完全可以通过单行代码实现和原多行if分支完全等价的统计逻辑,两种常用实现如下:
无额外依赖、鲁棒性最优的实现
直接使用生成器表达式配合内置sum函数即可,无需导入第三方工具:score = sum(scores.get(attr, 0) * is_triggered for attr, is_triggered in data.items())
逻辑说明
- Python中布尔值
True等价于整数1,False等价于整数0,分值与布尔值相乘后,触发的属性会保留对应分值,未触发的属性会被乘0抵消 - 使用
scores.get(attr, 0)取分值,可避免因两个字典键不完全匹配触发KeyError,鲁棒性更强 - 不依赖字典的键排列顺序,无论两个字典的键位置如何变动,都能正确匹配对应分值
针对你给出的测试数据,运行该代码会直接得到结果500,和原多行逻辑计算结果完全一致。
要求使用itertools工具集的实现
如果必须使用itertools工具集,可借助itertools.compress的筛选能力实现计算,为了避免字典顺序差异导致的错配,需要先按分值字典的键顺序对齐布尔判定结果:
import itertools score = sum(itertools.compress(scores.values(), (data.get(attr, False) for attr in scores.keys())))
这种写法的逻辑是:严格按照scores字典的键顺序,从data中取出对应属性的布尔判定结果,再通过compress保留所有判定为True的属性对应的分值,最后求和得到总分。
如果偷懒直接写sum(itertools.compress(scores.values(), data.values())),会强依赖两个字典的键插入顺序完全一致,在Python 3.7之前的版本可能直接出错,后续修改字典的键增删顺序也容易引发分值错配,不推荐这种简化写法。
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

