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

Python新手求助:如何按rank字段对多维字典排序

解决多维字典按"rank"字段排序的问题

嘿,我来帮你搞定这个排序问题~

你遇到的AttributeError: 'tuple' object has no attribute 'rank'是因为没搞清楚sorted()处理字典项时的结构:l.items()返回的每一项是(键名, 子字典)这样的元组,而attrgetter('rank')会直接尝试从这个元组里获取rank属性——但元组根本没有这个属性,所以就报错啦。

下面给你几种可行的解决方法:

方法一:用Lambda表达式(最直观)

Lambda可以直接帮你提取子字典里的rank值作为排序依据:

from collections import OrderedDict

# 你的原始字典
l = {"test":{"rank":61,"test":2},"test1":{"rank":12,"test":2},"test2":{"rank":23,"test":2}}

# 按rank升序排序,生成OrderedDict
d_sorted_by_value = OrderedDict(sorted(l.items(), key=lambda x: x[1]['rank']))

print("排序后的字典:")
print(d_sorted_by_value)

运行后会得到按rank从小到大排列的有序字典:

OrderedDict([('test1', {'rank': 12, 'test': 2}), ('test2', {'rank': 23, 'test': 2}), ('test', {'rank': 61, 'test': 2})])

如果需要降序排序,只需要加上reverse=True参数:

d_sorted_desc = OrderedDict(sorted(l.items(), key=lambda x: x[1]['rank'], reverse=True))

方法二:结合operator模块的函数(进阶用法)

如果你想用operator里的工具,可以先通过itemgetter拿到子字典,再用attrgetter取rank值,写法稍复杂但逻辑清晰:

from operator import itemgetter, attrgetter
from collections import OrderedDict

l = {"test":{"rank":61,"test":2},"test1":{"rank":12,"test":2},"test2":{"rank":23,"test":2}}
d_sorted = OrderedDict(sorted(l.items(), key=lambda x: attrgetter('rank')(itemgetter(1)(x))))

小提示:Python 3.7+ 可不用OrderedDict

从Python 3.7开始,普通字典已经默认保留插入顺序了,所以你可以直接把排序后的结果转成普通字典:

# Python 3.7+ 适用
d_sorted = dict(sorted(l.items(), key=lambda x: x[1]['rank']))

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:11:29