You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 09:50:34