对Python的排序内置感到沮丧(以范围和lambda为关键)

nic*_*ius 2 python sorting lambda python-3.x

我遇到了一些对我没用的东西.请参阅sortedwith range和的使用lambda:

sorted(range(-5, 6), key=lambda x: x * x)
Run Code Online (Sandbox Code Playgroud)

哪个在Python shell中输出:

[0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5]
Run Code Online (Sandbox Code Playgroud)

现在,对于我的生活,我不明白!我一直在玩弄sorted,lambda以及range和它没有任何意义.例如,如果range在for循环中运行该位,则会得到如下内容:

>>> for i in range(-5, 6):
...     print(i)
-5
-4
...
0
...
4
5
Run Code Online (Sandbox Code Playgroud)

并且lambda位:

>>> (lambda x: x * x)(-5)
25
Run Code Online (Sandbox Code Playgroud)

但把它们放在一起......我不明白如何使用key这种方式使命令独立于符号.

但这对我有意义:

>>> sorted(range(-5, 6), key=lambda x: abs(x))
[0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5]
Run Code Online (Sandbox Code Playgroud)

有人可以对此有所了解吗?

jwo*_*der 7

让我们一步一步地完成:

  • 你正在排序的序列是range(-5, 6),[-5, -4, -3, -2, -1, 0, 1, 2, 3, 4, 5].

  • 该序列的元素及其对应的键是:

      x | x * x
    ----|-------
     -5 | 25
     -4 | 16
     -3 |  9
     -2 |  4
     -1 |  1
      0 |  0
      1 |  1
      2 |  4
      3 |  9
      4 | 16
      5 | 25
    
    Run Code Online (Sandbox Code Playgroud)
  • 现在让我们按键对这个表进行排序:

             x | x * x
    -----------|-------
             0 |  0
      -1 and 1 |  1
      -2 and 2 |  4
      -3 and 3 |  9
      -4 and 4 | 16
      -5 and 5 | 25
    
    Run Code Online (Sandbox Code Playgroud)

    这意味着,输出sorted()将是0,则-11以某种顺序,然后-22在一些顺序等 sorted()进行稳定的排序,所以使用相同的密钥的任何输入元件将在相同的顺序,它们出现在所述输入输出; 因为负数出现在正数之前range(-5, 6),这意味着sorted()-1在之前1,-2之前2等输出.

  • 因此,最终的输出是[0, -1, 1, -2, 2, -3, 3, -4, 4, -5, 5].

  • @Idlehands或者,实际上,最好考虑对`(keyfunc(x),x)`形式的对列表进行排序,即"schwartzian变换"https://en.wikipedia.org/wiki/ Schwartzian_transform (2认同)