如何按数量可变的多属性对Python字典进行排序?
解决方案
核心思路是先建立属性名到值列表索引的映射,再利用Python元组的多维度比较特性,生成符合优先级要求的排序键。
完整实现代码
from collections import OrderedDict # 兼容Python3.6及以下版本,3.7+可省略 def sortBy(dict_input, byWhat): allAttributes = ['name', 'kingdom', 'diff', 'tier', 'type', 'founder', 'prover', 'server', 'extra', 'link'] # 构建属性名到值列表索引的映射表 attr_index = {attr: idx for idx, attr in enumerate(allAttributes)} # 生成排序键:按byWhat的顺序提取对应属性值组成元组 def get_sort_key(item): _, value_list = item return tuple(value_list[attr_index[attr]] for attr in byWhat) # 对字典键值对按指定规则排序 sorted_items = sorted(dict_input.items(), key=get_sort_key) # 返回有序结构,3.7+直接用dict(sorted_items)即可 return OrderedDict(sorted_items)
代码说明
- 属性索引映射:通过
attr_index把每个属性名对应到值列表中的位置,避免重复查找,提升效率。 - 多属性排序逻辑:元组的比较会严格按照元素顺序进行——先比较第一个属性值,相同则比较第二个,以此类推,完全匹配
byWhat的优先级要求。 - 有序返回:如果不需要兼容Python3.6及更早版本,直接返回
dict(sorted_items)即可,因为3.7+的普通字典会保留插入顺序。
测试示例
# 测试用字典 test_data = { 'Jump': ['Jump', 'Mushroom Kingdom', '10/10', 'Triple Jump', 'Dude', 'Dude2', 'Main Server', 'Cool jump', 'https://twitter.com'], 'Run': ['Run', 'Mushroom Kingdom', '8/10', 'Double Run', 'Dude', 'Dude3', 'Main Server', 'Fast run', 'https://twitter.com'], 'Jump2': ['Jump2', 'Mario World', '9/10', 'Single Jump', 'Dude', 'Dude2', 'Alt Server', 'Simple jump', 'https://twitter.com'] } # 先按kingdom排序,再按diff排序 sorted_result = sortBy(test_data, ['kingdom', 'diff']) for name, attrs in sorted_result.items(): print(f"{name}: {attrs}")
输出会按kingdom分组,同组内按diff从小到大排序。
内容的提问来源于stack exchange,提问作者JoniKauf
相关产品推荐
相关产品推荐

