Python字典值顺序异常及如何通过键获取对应值对比输入停止距离的问题
问题答疑与解决方案
1. set顺序错乱的原因
set是无序哈希集合结构,设计目标是快速判断元素存在性、自动去重,本身不会保留元素插入时的顺序,存入时会根据元素的哈希值自动调整存储位置,所以你提取字典值转set后顺序和插入顺序不一致是正常特性,和字典本身的顺序无关。
而且你当前的需求完全不需要提取所有值存set,直接通过车速键取对应标准距离即可。
2. 字典取值的正确写法
不管是普通Python字典(Python3.7及以上版本默认保留插入顺序)还是OrderedDict,通过键获取对应值的语法都是字典变量[键名],你代码里写的values.values[speed]是错误用法:values()是字典的内置方法,返回所有值的可迭代视图,不能用来按键取值。
你要获取输入车速对应的标准停车距离,直接写values[speed]即可。
3. 完整可运行实现代码
不需要额外用OrderedDict,Python3.7+普通字典就满足顺序要求,代码如下:
# 车速(km/h)为键,对应标准安全停车距离(m)为值 valid_speed = {20: 6, 30: 14, 40: 24, 50: 38, 60: 55, 70: 75} # 获取输入的车速,转为整数 speed = int(input("Enter the test speed> ")) # 校验车速是否在预设范围内 if speed not in valid_speed: print(f"当前输入的车速{speed}不在支持的测试范围内,支持的车速为{list(valid_speed.keys())}") else: # 获取标准安全距离 standard_dist = valid_speed[speed] # 获取实际停车距离 actual_dist = int(input("Enter the stopping distance> ")) # 对比判断 if actual_dist <= standard_dist: print(f"停车距离符合要求:当前车速{speed}km/h对应标准安全距离为{standard_dist}m,实际停车距离{actual_dist}m") else: print(f"停车距离不符合要求:当前车速{speed}km/h对应标准安全距离为{standard_dist}m,实际停车距离{actual_dist}m,超出安全范围")
如果必须用OrderedDict兼容旧版本Python,仅修改字典定义部分即可,逻辑完全一致:
from collections import OrderedDict valid_speed = OrderedDict([(20,6), (30,14), (40,24), (50,38), (60,55), (70,75)]) # 后续逻辑和上面代码完全一致
内容的提问来源于stack exchange,提问作者lewisv12
相关产品推荐
相关产品推荐

