在Python中按值和键排序字典?

在Python中按值和键排序字典?,python,dictionary,Python,Dictionary,我有以下字典: dic = {'s': 3, 'a': 2, 'w': 2, 'y': 2, 'x': 2, 'm': 4, 'd': 5} 我需要先按值对元素排序,如果值重复,然后按键排序,这样我将得到以下输出: dic = [('d', 5), ('m', 4), ('s', 3), ('a', 2), ('w', 2), ('x', 2), ('y', 2)] 我已尝试使用此代码: sorted(dic.items(), key=lambda x: x[1], reverse=True

我有以下字典:

dic = {'s': 3, 'a': 2, 'w': 2, 'y': 2, 'x': 2, 'm': 4, 'd': 5}
我需要先按值对元素排序,如果值重复,然后按键排序,这样我将得到以下输出:

dic = [('d', 5), ('m', 4), ('s', 3), ('a', 2), ('w', 2), ('x', 2), ('y', 2)]
我已尝试使用此代码:

sorted(dic.items(), key=lambda x: x[1], reverse=True)
但我一直得到相同的输出(键等于2的字母不是按字母顺序排列的):

有人知道我如何解决这个问题吗


提前感谢。

您就快到了,您需要在lambda排序中同时包含键和值:

sorted(dic.items(), key=lambda x: (-x[1],x[0]))

使用此键的定义

key=lambda x: (x[1],x[0])

您可以使用key函数对dict项进行排序,该函数返回一个2元组,其中dict项的反数值作为第一项,key作为第二项:

sorted(dic.items(), key=lambda t: (-t[1], t[0]))
这将返回:

[('d', 5), ('m', 4), ('s', 3), ('a', 2), ('w', 2), ('x', 2), ('y', 2)]

这个答案的字母顺序相反,因为
reverse=True
key=lambda x:(-x[1],x[0]),reverse=False将解决此问题,但如果未为对象定义
-
运算符,则可能会导致其他问题。谢谢,Nicolas。它工作得很好。你能解释一下在这种情况下lambda函数背后的逻辑吗?我听不懂。这个答案的字母顺序是相反的。
[('d', 5), ('m', 4), ('s', 3), ('a', 2), ('w', 2), ('x', 2), ('y', 2)]