python';什么是分类功能?

python';什么是分类功能?,python,sorting,dictionary,Python,Sorting,Dictionary,说我有 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)] 但是这是如何工作的呢?传递给键的函数将被赋予每个被排序的项,并返回一个Python可以排序的“键”。因此,如果要按字符串的相反方向对

说我有

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

但是这是如何工作的呢?

传递给
键的函数将被赋予每个被排序的项,并返回一个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])

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

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

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

>>> votes = {'Charlie': 20, 'Able': 10, 'Baker': 20, 'Dog': 15}
如果我们在上面的
投票
字典中应用
.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]
作为排序的基础,对
投票中的
(元组)
项进行排序

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

如果键中有一个平局,则项目将按照它们最初在字典中的顺序排列。(所以
('Charlie',20)
('Baker',20)
之前,因为钥匙上有一个
20==20
领带,但是('code>Charlie',20)
('Baker',20)
之前在原始
字典中)

然后输出为:

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

我希望这样更容易理解

参数将函数作为其值,在排序之前应用于每个元素,以便根据此函数的输出对元素进行排序

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

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

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

我明白了,谢谢,那么如果我更改了键以返回一个元组呢?那里发生了什么事
key=lambda x:(-x[1],x[0])
将按元组排序
(-value,key)
。它最终将按照从最大到最小的值进行排序,并打破与键的联系。结果将是
[('Baker',20),('Charlie',20),('Dog',15),('Able',10)]
。哦,好吧,如果排序忽略了
x[0]
关键方面,那么在元组中设置它的目的是什么?我想我的意思是,为什么我要在lambda中返回一个元组呢?
x[0]
并没有被忽略;它用于与元组中的第一项断开联系。这就是为什么在对元组排序时,
('Baker',20)
总是排在
('Charlie',20)
前面,Python首先按第一个值排序。然后,如果有任何关系(即两个或多个元组具有相同的第一个值),则按第二个值排序,如果第二个值中有任何关系,则按第三个值排序,等等。将其视为按字母顺序排序单词。首先按第一个字母排序;如果有任何联系,请按第二个字母排序;你继续走,直到不再有领带,或者你的信用完了。