为何使用sorted()对字典嵌套值排序时未生效?
嵌套字典内层排序问题解析
你要实现的是对嵌套字典的内层字典按「值降序,值相同时按键升序」排序,下面拆解两段代码的问题和正确实现方式:
第一段代码为啥没用
这段代码完全搞错了排序对象,还存在语法错误:
sorted_dict = dict(sorted(article_counter.items(), key=lambda x: (x[1][1], x[1][0])), reverse=True)
sorted(article_counter.items(), ...)是在外层字典的键值对上排序,但你的外层只有"Title1"一个条目,等于白排;x[1][1]根本不对:x[1]是内层字典,字典不能用数字索引取元素,跑起来直接报KeyError;reverse=True放错地方了,它是sorted()的参数,得写在sorted()的括号里,现在这样写法都不合法。
第二段代码为啥能成
这段代码找对了排序对象——内层字典的键值对,但有个细节可以优化:
# 修正后可直接运行的代码 sorted_dict = {} for title, inner in article_counter.items(): # 按值降序,值相同则按键升序排序内层字典 sorted_inner = dict(sorted(inner.items(), key=lambda entry: (-entry[1], entry[0]))) sorted_dict[title] = sorted_inner
- 遍历外层字典的每个标题和对应的内层字典;
sorted(inner.items(), ...)专门针对内层的键值对排序:key=lambda entry: (-entry[1], entry[0]):用-entry[1]实现值从大到小排,值一样的时候,用entry[0](键)从小到大排,正好匹配你的需求;- 最后用
dict()把排序后的元组列表转成字典(Python 3.7及以上版本的字典会保留插入顺序,所以排序结果能保留)。
要是想用你原来的reverse=True写法,得调整key:
sorted_inner = dict(sorted(inner.items(), key=lambda entry: (entry[1], entry[0]), reverse=True))
不过这个写法会让值相同的键按降序排(比如C在前A在后),和你要的A:2在前、C:2在后不符,所以还是用-entry[1]的写法更准确。
最终输出
运行修正后的代码,输入article_counter = {"Title1": {'C': 2, 'B': 1, 'A': 2}},会得到你想要的结果:
{"Title1": {'A': 2, 'C': 2, 'B': 1}}
内容的提问来源于stack exchange,提问作者joeybones
相关产品推荐
相关产品推荐

