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
相关产品推荐
相关产品推荐

