如何理解这种排序功能的结果

时间:2019-02-09 19:16:01

标签: python sorting lambda key

我是编程和学习排序功能的新手。当我进行搜索并查看了许多有关sort / lambda的SO文章时,甚至与我的情况非常相似,但我仍然很难理解该代码的工作原理。我还阅读了文档(https://docs.python.org/3/howto/sorting.html),那里的示例对我来说很有意义,但我似乎无法在此处将这个知识带到此示例中。有人会友好地为我提供以下代码吗?我知道这可能是重复的,但我只是问一下,因为我没有从其他类似文章中获得的知识。如果可以的话请帮助,谢谢。

a = [13, 15, 81, 4]
b = [0, 1, 2, 3]
b.sort(key = lambda x:a[x])
b = [3, 0, 1, 2]

列表'b'的顺序如何从[0,1,2,3]变为[3,0,1,2]?列表“ a”如何发挥作用?

2 个答案:

答案 0 :(得分:5)

它对b进行排序,就好像b中的每个元素都具有a中相应值的值一样。如果对由每个值组成的元组进行排序,可能会有助于了解会发生什么。

>>> sorted(zip(a, b))
[(4, 3), (13, 0), (15, 1), (81, 2)]

请注意每个元组的第二个元素,它们按照第一个元素的顺序排序。

答案 1 :(得分:1)

列表b的值很重要

b的值很重要,因为它们用于索引到a中。您最初给出的示例不会引发错误,因为每个b的值都可以用作从b检索值的索引。

换句话说,如果b的值从[0, 1, 2, 3]变为[1, 2, 3, 4],这将导致IndexError作为最后一个元素4,将指向a中不存在的第五个元素。


进一步的解释

b按以下函数排序(又称原始lambda函数)。

def anonymous(x):
    return a[x]

实际情况是,b的每个值都用作a的索引,以检索和比较a的值。

a[0] = 13
a[1] = 15
a[2] = 81
a[3] = 4

在这里,我们以升序对每个等式的右侧进行排序:[4, 13, 15, 81]。然后,我们以相同的顺序获取b的相应值:[3, 0, 1, 2],这将产生最终的排序数组b