假设我有
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)]
但是这是如何运作的呢?
假设我有
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
的函数会接收到被排序的每个项目,并返回一个 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])
>>> 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)]
key是一个函数,在比较集合的元素之前将被调用以转换它们。传递给key的参数必须是可调用的内容。
使用lambda创建了一个匿名函数(可调用)。在sorted中,可调用只需要一个参数。Python的lambda非常简单。它只能做并返回一件事情。
key
参数接受一个函数作为其值,该函数应用于排序前的每个元素,以便根据此函数的输出对元素进行排序。
例如,如果您想根据字符串的长度对字符串列表进行排序,可以执行以下操作:
list = ['aaaaaa', 'bb', 'ccc', 'd']
sorted(list, key=len)
# ['d', 'bb', 'ccc', 'aaaaaa']
key = lambda x: (-x[1],x[0])
- Cheese(-value, key)
进行排序。它最终会按从大到小的值进行排序,并使用键来打破平局。结果将是[('Baker', 20), ('Charlie', 20), ('Dog', 15), ('Able', 10)]
。 - Cyphasex[0]
键被排序忽略了,它的目的是什么?我想我的意思是,为什么我要在lambda中返回一个元组呢? - Cheesex[0]
并没有被忽略,它被用来在元组中与第一项进行比较。这就是为什么('Baker', 20)
总是排在('Charlie', 20)
前面的原因。 - Cyphasex[0]
允许按照它们的键对等值进行排序?很抱歉,我不太明白您所说的“用键打破平局”的意思。 - Cheese