这是什么意思:key = lambda x:x [1]?

时间:2013-04-30 22:31:19

标签: python python-2.7

我看到它用于排序,但这行代码的各个组成部分究竟是什么意思?

key=lambda x: x[1]

什么是lambda,什么是x:,为[1]中的x[1]等等...

实施例

max(gs_clf.grid_scores_, key=lambda x: x[1])

sort(mylist, key=lambda x: x[1])

6 个答案:

答案 0 :(得分:16)

lambda有效地创建了内联函数。例如,您可以重写此示例:

max(gs_clf.grid_scores_, key=lambda x: x[1])

使用命名函数:

def element_1(x):
    return x[1]

max(gs_clf.grid_scores_, key=element_1)

在这种情况下,max()将返回该数组中的元素,其第二个元素(x[1])大于所有其他元素的第二个元素。另一种表达方式是函数调用暗示:使用x[1]作为返回max元素。

答案 1 :(得分:13)

lambda表示anonymous function。在这种情况下,此函数采用单个参数x并返回x[1](即x中索引1处的项)。

现在,sort(mylist, key=lambda x: x[1])根据应用于列表中每个元素的mylist值对key进行排序。同样,max(gs_clf.grid_scores_, key=lambda x: x[1])会针对每个元素的gs_clf.grid_scores_返回的内容返回key的最大值。

我还应该指出,这个特定的功能已经包含在其中一个库中:operator。具体而言,operator.itemgetter(1)相当于您的key

答案 2 :(得分:3)

x[1]

这是功能。 这里x是列表,我们在其中添加{{1}},即list的第二个元素到sort函数。所以,基本上我们将每个列表的第二个元素(即x [1])添加到sort函数中。 我希望你能理解这一点。

答案 3 :(得分:2)

根据Python 3.7(https://docs.python.org/3/howto/sorting.html)的参考,键为list.sort()sorted()的参数。第一个内置函数在适当位置修改列表,而后者接受并返回可迭代。

可以将key参数定义为在比较和排序之前分别在list / iterable的每个元素上调用的函数。在这种情况下,内联函数lambda x: x[1]被定义为键参数的值。 lambda函数接受输入x返回x [1],它是x的第二个元素。

应该

mylist = [[7, 8], [1, 2, 3], [2, 5, 6]]
# list(map(lambda x: x[1], mylist)) returns [8, 2 ,5]

mylistSort = sorted(mylist, key = lambda x: x[1])
# will sort the nested list based on the result of the lambda function 

你能猜出什么结果吗?那么mylistSort是[8,2,5]的排序序列[2,5,8]的[[1,2,3],[2,5,6],[7,8]]。

您的示例中的max()仅用于从排序函数的结果中获取最大值。

我希望这篇文章对您有所帮助。

答案 4 :(得分:2)

使用key = lambda的 sorted()函数的另一个示例。让我们考虑一下您有一个元组列表。在每个元组中,您都有汽车的品牌,型号和重量,并且您想要按品牌,型号或重量对这个元组列表进行排序。您可以使用lambda来实现。

page_id      content         name
1            {cat, dog}      John
1            NaN             Anne
2            NaN             Ethan
3            {sea, earth}    John
3            {earth, green}  Anne
3            NaN             Ethan
4            NaN             Mark

结果:

rails -v
...
Ignoring sqlite3-1.3.13 because its extensions are not built.  Try: gem pristine sqlite3 --version 1.3.13
Ignoring websocket-driver-0.6.5 because its extensions are not built.  Try: gem pristine websocket-driver --version 0.6.5
Ignoring websocket-native-1.0.0 because its extensions are not built.  Try: gem pristine websocket-native --version 1.0.0
Could not find nokogiri-1.10.4 in any of the sources
Run `bundle install` to install missing gems.

答案 5 :(得分:1)

student_tuples = [
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),]
sorted(student_tuples, key=lambda student: student[2])   # sort by age
>>>>[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]

摘自官方文档