我有以下功能:
def calculate(blob, count_per_data):
return geometric_mean( [score_per_count[ count_per_data[data] ] for data in combinations(blob)] )
我的代码存在的问题是,如果在data
中找不到count_per_data
,我会收到异常。相反,我希望count_per_data["unknown"]
评估为0,即"unknown"
的计数为0.
反过来,值{0}存在于score_per_count
中且不等于0.换句话说,与计数0相关联的分数本身不是0.
您如何建议我修复上述代码以实现我的目标?
答案 0 :(得分:4)
如果您想确保data
中存在count_per_data
且count_per_data
中存在score_per_count
的值,则可以使用列表推导作为过滤器,像这样
return geometric_mean([score_per_count[count_per_data[data]] for data in combinations(blob) if data in count_per_data and count_per_data[data] in score_per_count])
更易读的版本,
return geometric_mean([score_per_count[count_per_data[data]]
for data in combinations(blob)
if data in count_per_data and count_per_data[data] in score_per_count])
但是,如果要在字典中找不到密钥时使用默认值,则可以使用dict.get
。引自dict.get
文档,
get(key[, default])
如果key在字典中,则返回key的值,否则返回default。如果 默认情况下没有给出,默认为None,所以这个方法永远不会 提出了一个KeyError。
您可以像这样使用它
count_per_data.get(data, 0)
如果在data
中找不到count_per_data
,则会使用0
。
答案 1 :(得分:1)
将条件添加到理解列表中:
return geometric_mean([score_per_count[count_per_data[data]] for data in combinations(blob) if data in count_per_data.keys() and count_per_data[data]] in geometric_mean.keys() else 0)