Python中sorted函数的关键字参数是如何工作的?

28

假设我有

votes = {'Charlie': 20, 'Able': 10, 'Baker': 20, 'Dog': 15}

我理解

print(sorted(votes.items(), key=lambda x: x[1]))

会导致

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

但是这是如何运作的呢?


我明白了,谢谢。那如果我将键更改为返回元组呢?那里发生了什么? key = lambda x: (-x[1],x[0]) - Cheese
1
这将按元组(-value, key)进行排序。它最终会按从大到小的值进行排序,并使用键来打破平局。结果将是 [('Baker', 20), ('Charlie', 20), ('Dog', 15), ('Able', 10)] - Cyphase
哦,好的,那么如果在元组中x[0]键被排序忽略了,它的目的是什么?我想我的意思是,为什么我要在lambda中返回一个元组呢? - Cheese
x[0]并没有被忽略,它被用来在元组中与第一项进行比较。这就是为什么('Baker', 20)总是排在('Charlie', 20)前面的原因。 - Cyphase
所以,由于它们具有相同的值,x[0] 允许按照它们的键对等值进行排序?很抱歉,我不太明白您所说的“用键打破平局”的意思。 - Cheese
2
在对元组进行排序时,Python首先按第一个值进行排序。然后,如果存在任何平局(即两个或更多元组具有相同的第一个值),则按第二个值进行排序,如果第二个值中存在任何平局,则按第三个值进行排序,以此类推。可以将其视为按字母顺序排序单词。首先按第一个字母排序;如果存在任何平局,则按第二个字母排序;继续进行,直到没有更多平局或字母用完。 - Cyphase
4个回答

12
你传递给 key 的函数会接收到被排序的每个项目,并返回一个 Python 可以排序的“键”。因此,如果您想按字符串的反向对字符串列表进行排序,可以这样做:
list_of_strings.sort(key=lambda s: s[::-1])

这样可以让您指定每个项目排序的值,而无需更改项目。这样,您就不必构建一个反转字符串列表,对其进行排序,然后再将其反转回来。

# 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])

在你的代码中,它按元组中第二个项目对每个项目进行排序,而通常它会先按元组中的第一个项目进行排序,然后再用第二个项目来解决平局。

7
>>> votes = {'Charlie': 20, 'Able': 10, 'Baker': 20, 'Dog': 15}

如果我们在上面的votes字典上应用.items(),我们会得到:
>>> 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

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

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

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

当 key 值相同时,项目按照它们在字典中的原始顺序进行排名。(因此, ('Charlie',20) ('Baker',20) 之前,因为在关键值上有一个 20 == 20 的绑定,但是( '< code> Charlie',20)
在原始
votes 字典中出现在('Baker', 20)之前)。

然后输出:

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

我希望您能理解得更简单明了。

3

key是一个函数,在比较集合的元素之前将被调用以转换它们。传递给key的参数必须是可调用的内容。

使用lambda创建了一个匿名函数(可调用)。在sorted中,可调用只需要一个参数。Python的lambda非常简单。它只能做并返回一件事情。


3

key参数接受一个函数作为其值,该函数应用于排序前的每个元素,以便根据此函数的输出对元素进行排序。

例如,如果您想根据字符串的长度对字符串列表进行排序,可以执行以下操作:

    list = ['aaaaaa', 'bb', 'ccc', 'd']
    sorted(list, key=len)

    # ['d', 'bb', 'ccc', 'aaaaaa']

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接