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

如何按数量可变的多属性对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 07:25:32