我指的是为How to sort (list/tuple) of lists/tuples?提供的解决方案。
sorted_by_second = sorted(data, key=lambda tup: tup[1])
或
data.sort(key=lambda tup: tup[1]) # sorts in place
在任一排序函数中, tup 在哪里传递给lambda函数?
答案 0 :(得分:1)
tup
是lambda
的参数。
lambda tup: tup[1]
等效于:
def anonymous_func(tup):
return tup[1]
答案 1 :(得分:1)
由sort
本身。 key
参数是一个回调函数,sort
在要排序的序列的每个元素上调用。它使您可以更简洁地编写如下内容:
new_data = [(tup[1], tup) for tup in data]
tmp = sorted(data)
sorted_by_second = [orig for _, orig in tmp]
答案 2 :(得分:1)
在lambda函数lambda tup: tup[1]
中,tup引用列表data
的元素,而tup[1]
引用该项的第二个元素。
将其传递给sorted函数时,告诉它使用列表中项目的第二个元素作为比较键,因此得到的结果是第二个元素上的排序列表
来自文档
key指定一个参数的功能,该参数用于从iterable中的每个元素中提取比较键(例如,key = str.lower)。默认值为无(直接比较元素)。
因此,行为如下
In [54]: data = [[4,5,6], [1,2,3], [7,8,9]]
In [55]: sorted_by_second = sorted(data, key=lambda tup: tup[1])
In [56]: sorted_by_second
Out[56]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
请注意,您还可以使用operator.itemgetter执行相同的操作,这会自动从元组中选择第二个元素
In [60]: import operator
In [64]: data = [[4,5,6], [1,2,3], [7,8,9]]
In [65]: sorted_by_second = sorted(data, key=operator.itemgetter(1))
In [66]: sorted_by_second
Out[66]: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
答案 3 :(得分:0)
此处key
是一个变换函数,应用于数组的每个元素以提供新值,然后将其用于对数组进行排序。从本质上讲,这使得应该将元素排序为基于key(a) < key(b)
而不是a < b
的元素。
list.sort
和sorted
函数将分别为每个元素调用key
。