Python字典值取键实现超速罚单计算的代码问题排查
问题分析与修正
嘿,我一眼就瞅出你代码里的核心问题——你把生日和非生日场景的字典搞反了!这直接导致那两个测试用例的结果完全颠倒啦。
具体错误点
你定义的Bir_dict用的是非生日时的正常阈值(≤60、61-80、≥81),而NoBir_dict反而用了生日时的放宽阈值(≤65、66-85、≥86)。但在逻辑判断里,你却在is_birthday为True时调用Bir_dict,非生日时调用NoBir_dict,这完全搞反了规则!
举个例子:
- 对于
caught_speeding(65, False):非生日应该用正常阈值,65属于61-80区间,返回1,但你的代码用了NoBir_dict(生日阈值),65≤65,返回0,所以失败。 - 对于
caught_speeding(65, True):生日应该用放宽阈值,65≤65,返回0,但你的代码用了Bir_dict(正常阈值),65属于61-80区间,返回1,所以失败。
修正后的代码
我帮你把字典的定义和调用逻辑对应正确,同时优化了变量名让可读性更好:
def caught_speeding(speed, is_birthday): # 生日场景:阈值提高5 birthday_rules = {0: speed <= 65, 1: 66 <= speed <= 85, 2: speed >= 86} # 非生日场景:原始阈值 normal_rules = {0: speed <= 60, 1: 61 <= speed <= 80, 2: speed >= 81} def get_key(dictionary, target_value): # 因为规则互斥,只会有一个key对应True,所以直接取第一个元素 return [key for key in dictionary if dictionary[key] == target_value][0] if is_birthday: return get_key(birthday_rules, True) else: return get_key(normal_rules, True)
额外小提示
虽然你知道从字典值找键不是最优解,但这里因为规则是互斥的,所以不会出现多个键对应True的情况,这个写法是可行的。如果想更简洁,也可以用生成器表达式替代列表推导,避免创建不必要的列表:
return next(key for key in dictionary if dictionary[key] == target_value)
内容的提问来源于stack exchange,提问作者pyeR_biz
相关产品推荐
相关产品推荐

