List Comprehension中的KeyError异常

时间:2014-01-24 09:13:51

标签: python python-3.x

我有以下功能:

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.

您如何建议我修复上述代码以实现我的目标?

2 个答案:

答案 0 :(得分:4)

如果您想确保data中存在count_per_datacount_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)