按值和键对字典内容进行排序

4 投票
3 回答
1888 浏览
提问于 2025-04-16 23:40

对字典的内容按照值进行排序的方法已经有很多人详细讲过了,所以可以用类似下面的方式来实现:

d={'d':1,'b':2,'c':2,'a':3}
sorted_res_1= sorted(d.items(), key=lambda x: x[1]) 
# or
from operator import itemgetter 
sorted_res_2 = sorted(d.items(), key=itemgetter(1)) 

我想问的是,怎样才能得到以下这种输出:

[('d', 1), ('b', 2), ('c', 2), ('a', 3)],而不是 [('d', 1), ('c', 2), ('b', 2), ('a', 3)]。

也就是说,元组要先按照值排序,如果值相同的话,再按照键排序。

另外,是否可以做到反向排序:比如得到 [('a', 3), ('b', 2), ('c', 2), ('d', 1)],而不是 [('a', 3), ('c', 2), ('b', 2), ('d', 1)]?

3 个回答

0

这里有一个替代的方法,跟你自己的例子非常相似:

sorted(d.items(), key=lambda x: (x[1], x[0]))
2

你只是想要标准的 tuple 比较,但想要反向比较:

>>> sorted(d.items(), key=lambda x: x[::-1])
[('d', 1), ('b', 2), ('c', 2), ('a', 3)]
4

sorted 函数的 key 参数可以返回一个元组。如果返回的是元组,那么元组中的第一个元素会用来排序,第二个元素用来解决相同的情况,第三个元素用来解决仍然相同的情况,依此类推……

In [1]: import operator

In [2]: d={'d':1,'b':2,'c':2,'a':3}

In [3]: sorted(d.items(),key=operator.itemgetter(1,0))
Out[3]: [('d', 1), ('b', 2), ('c', 2), ('a', 3)]

operator.itemgetter(1,0) 会返回一个元组,这个元组是由第二个元素和第一个元素组成的。也就是说,如果 f=operator.itemgetter(1,0),那么 f(x) 会返回 (x[1],x[0])

撰写回答