按值和键对字典内容进行排序
对字典的内容按照值进行排序的方法已经有很多人详细讲过了,所以可以用类似下面的方式来实现:
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])
。