为什么Python的sorted()方法不能颠倒字典中具有相同值的键的顺序?

mat*_*man 4 python sorting dictionary python-3.x

当我遇到以下怪异问题时,我正在为解决一些古老的Code Advent问题做准备。假设我们有以下Python字典:

d = {'a':5, 'b':4, 'c':4, 'd':2, 'e':3, 'f':1}
Run Code Online (Sandbox Code Playgroud)

如果按字典的键对字典进行排序,则会得到以下结果:

>>>print(sorted(d, key=d.get))
['f','e','d','c','b','a']
Run Code Online (Sandbox Code Playgroud)

现在,如果我们尝试逆转此顺序,则会得到以下结果:

>>>print(sorted(d, key=d.get, reverse=True))
['a','c','b','d','e','f']
Run Code Online (Sandbox Code Playgroud)

这给我提出了两个问题:

  1. 为什么在遍历字典时,它第一次看到是与键有关的,为什么原始的按键排序仍在c之前列出?b4b
  2. 为什么颠倒的顺序保持这种顺序,而不是颠倒原始排序中找到的键的顺序?

我确定还有其他方法可以解决此问题,但现在我对sorted导致此问题的方法的机理感到好奇。

use*_*ica 8

reverse=True并不意味着对输入进行排序然后将其反转。reverse=True 表示反转比较结果

reverse是一个布尔值。如果设置为True,则对列表元素进行排序,就好像每个比较都被反转一样。

排序仍然是稳定的,因此按比较顺序相等的元素将按在输入中出现的顺序保留。


现在,您可能会想,嘿,输入中的“ c”不在“ b”之前!这意味着您必须使用字典不保留插入顺序的Python版本,因此字典的顺序不是您在源代码中编写项目的顺序。该命令sorted看到其输入基本上是任意的。如果要保留订单字典,则必须使用较新的Python或collections.OrderedDict