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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:36:02