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

如何基于用户配置的多属性优先级对Room对象列表排序?

问题:动态根据YAML配置指定Room对象的排序属性优先级

我有一个用dataclass定义的Room类:

@dataclass
class Room():
    house_num: int
    room_num: int
    view: str

目前已经实现了固定多属性排序的代码:

all_rooms.sort(key=lambda r: (r.house_num, r.room_num, r.view))

但希望能让用户通过YAML配置文件指定排序的属性优先级顺序,比如配置文件内容为:

priority: [view, house_num, room_num]

此时排序的key要自动对应为(r.view, r.house_num, r.room_num),不需要手动修改sort()里的逻辑,请问该怎么实现?

解决方案

可以通过以下步骤实现动态排序:

  • 读取YAML配置文件:使用pyyaml库加载配置,获取指定的属性优先级列表
  • 动态生成排序key函数:根据配置里的属性名,依次提取Room对象对应的属性值,组成排序用的元组
  • 执行排序:将动态生成的key函数传入sort()方法

具体代码示例

首先确保安装了pyyaml:

pip install pyyaml

然后编写实现代码:

from dataclasses import dataclass
import yaml

@dataclass
class Room():
    house_num: int
    room_num: int
    view: str

# 读取YAML配置
with open('config.yaml', 'r', encoding='utf-8') as f:
    config = yaml.safe_load(f)
# 配置未指定priority时,使用默认排序规则
priority = config.get('priority', ['house_num', 'room_num', 'view'])

# 动态生成排序key
def sort_key(room):
    return tuple(getattr(room, attr) for attr in priority)

# 执行排序
all_rooms.sort(key=sort_key)

说明

  • 使用getattr(room, attr)可以根据字符串形式的属性名,动态获取Room对象的对应属性值
  • 配置文件中未指定priority时,会使用预设的默认排序优先级,避免程序报错
  • 这种方式完全不需要修改sort()的核心逻辑,仅调整YAML配置即可改变排序规则

内容的提问来源于stack exchange,提问作者Georgia Martinez

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 09:07:12