Python使用推导式获取字典指定键值报错或返回空值问题排查
错误原因
三个失败方案的核心问题是完全搞反了字典键值的匹配逻辑:
- 你调用
operating_hrs.values()拿到的遍历对象全是字典里存的数值:8、6、5、3、5.25、0这些工时数字,判断条件却写的是day == v,也就是拿字符串"FRIDAY"和数字做相等比较,永远不可能匹配成功,筛选出来的结果自然是空列表。 - 方案1直接取空列表的第0个元素,必然触发
IndexError: list index out of range报错,而且报错里还出现了未定义的变量x,属于额外笔误。 - 方案2没有取索引,直接返回空列表。
- 方案3额外写的
v[0]逻辑完全无效:values()返回的都是整数、浮点数,根本不支持下标索引,就算真匹配到值也会触发类型错误。
正确实现方法
Python字典本身就原生支持按键快速查值,根本不需要写列表推导遍历,常用写法有两种:
- 确定键一定存在时,直接用键做索引即可,写法最简洁:
operating_hrs = {'MONDAY': 8, 'TUESDAY': 6, 'WEDNESDAY': 5, 'THURSDAY': 8, 'FRIDAY': 3, 'SATURDAY': 5.25, 'SUNDAY': 0} day = "FRIDAY" friday_hrs = operating_hrs[day] print(friday_hrs) # 输出:3
- 不确定键是否存在时,用
get()方法避免触发KeyError,还可以自定义键不存在时的返回值:
# 键存在返回对应值,不存在默认返回None,也可以自己传第二个参数当默认值,比如operating_hrs.get(day, 0) friday_hrs = operating_hrs.get(day) print(friday_hrs) # 输出:3
要是硬要用列表推导遍历实现(非常不推荐,性能比原生按键查值差很多),得遍历键值对、匹配键而不是匹配值:
friday_hrs = [v for k, v in operating_hrs.items() if k == day][0]
内容的提问来源于stack exchange,提问作者iBoon
相关产品推荐
相关产品推荐

