如何基于用户配置的多属性优先级对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
相关产品推荐
相关产品推荐

