python排序函数中的关键参数如何工作?

Che*_*ese 8 python sorting dictionary

说我有

votes = {'Charlie': 20, 'Able': 10, 'Baker': 20, 'Dog': 15}
Run Code Online (Sandbox Code Playgroud)

我明白

print(sorted(votes.items(), key = lambda x: x[1]))
Run Code Online (Sandbox Code Playgroud)

会导致

[('Able',10),('Dog',15),('Baker',20),('Charlie',20)]`

但这是如何工作的?

小智 7

>>> votes = {'Charlie': 20, 'Able': 10, 'Baker': 20, 'Dog': 15}
Run Code Online (Sandbox Code Playgroud)

如果我们应用上面的.items()字典,votes我们会得到:

>>> votes_items=votes.items()
>>> votes_items
[('Charlie', 20), ('Baker', 20), ('Able', 10), ('Dog', 15)]
#a list of tuples, each tuple having two items indexed 0 and 1
Run Code Online (Sandbox Code Playgroud)

对于每个元组,第一个索引[0]是字符串 ( 'Charlie','Able','Baker','Dog'),第二个索引是[1]整数 ( 20,10,20,15)。

print(sorted(votes.items(), key = lambda x: x[1]))(tuples)指示 python使用每个元组的votes第二个索引([1]整数)作为排序的基础对项目进行排序。

Python 比较每个元组中的每个整数,并返回一个列表,该列表reverse=True使用每个元组的整数作为 来key确定元组的排名,以升序排列每个元组(这可以与参数反转),

如果键中存在平局,则项目按照它们最初在字典中的顺序排列。(('Charlie', 20)之前也是如此,因为键上('Baker', 20)有一个领带,但是('在原始字典中出现在之前)。20==20Charlie', 20)('Baker', 20)votes

那么输出是:

 [('Able', 10), ('Dog', 15), ('Charlie', 20), ('Baker', 20)]
Run Code Online (Sandbox Code Playgroud)

我希望这能让它更容易理解。


Cyp*_*ase 5

传递key给您的函数将获得要排序的每个项目,并返回Python可以排序的“键”。因此,如果要按字符串的相反顺序对字符串列表进行排序,可以执行以下操作:

list_of_strings.sort(key=lambda s: s[::-1])
Run Code Online (Sandbox Code Playgroud)

这使您可以指定每个项目的排序依据值,而不必更改项目。这样,您不必构建反向字符串列表,对其进行排序,然后将其反向反向。

# DON'T do this

data = ['abc', 'def', 'ghi', 'jkl']
reversed_data = [s[::-1] for s in data]
reversed_data.sort()
data = [s[::-1] for s in reversed_data]

# Do this

data.sort(key=lambda s: s[::-1])
Run Code Online (Sandbox Code Playgroud)

在您的情况下,代码按元组中的第二个项目对每个项目进行排序,而通常它最初将按元组中的第一个项目进行排序,然后中断与第二个项目的联系。


Cod*_*ife 5

key 是一个函数,将被调用以在比较集合的项目之前对其进行转换。传递给 key 的参数必须是可调用的。

使用 lambda 创建一个匿名函数(可调用)。在 sorted 的情况下,callable 只接受一个参数。Python 的 lambda 非常简单。它真的只能做和返回一件事。