如何用Pythonic方式按RELAY_PINS顺序排序Device对象列表?
Pythonic 排序方案:基于固定元组排序Device列表
先给出最小可复现示例:
# 固定的继电器安装顺序引脚 RELAY_PINS = (23, 17, 27, 22) class Device: def __init__(self, name, pin): self.name = name self.pin = pin # 定义顺序随机的Device实例列表 devices = [ Device("Fan", 27), Device("Light", 17), Device("Heater", 22), Device("Humidifier", 23) ]
方案1:利用内置排序+索引映射(简洁优先)
直接使用sorted()函数,以RELAY_PINS中引脚的索引作为排序键,一行代码搞定:
sorted_devices = sorted(devices, key=lambda d: RELAY_PINS.index(d.pin))
原理:RELAY_PINS.index(d.pin)返回当前设备引脚在固定顺序元组中的位置,排序时按这个位置从小到大排列,完美匹配继电器安装顺序。
方案2:预构建映射字典(性能优先)
如果RELAY_PINS元素数量较多,list.index()的线性查找会拖慢效率,提前构建一个引脚到索引的字典,将查找复杂度降为O(1):
# 预生成引脚-顺序索引的映射 pin_to_order = {pin: idx for idx, pin in enumerate(RELAY_PINS)} # 基于映射排序 sorted_devices = sorted(devices, key=lambda d: pin_to_order[d.pin])
验证排序结果
执行以下代码验证:
for dev in sorted_devices: print(f"{dev.name} (引脚: {dev.pin})")
输出将严格遵循RELAY_PINS的顺序:
Humidifier (引脚: 23) Light (引脚: 17) Fan (引脚: 27) Heater (引脚: 22)
额外提示
为避免因设备引脚不在RELAY_PINS中导致报错,可提前添加校验:
assert all(d.pin in RELAY_PINS for d in devices), "存在未在RELAY_PINS中定义的引脚"
内容的提问来源于stack exchange,提问作者Lord Elrond
相关产品推荐
相关产品推荐

