如何在Python中使用Lambda进行排序


187

在Python中,我试图按日期与lambda排序。我无法理解我的错误消息。消息是:

<lambda>() takes exactly 1 argument (2 given)

我的电话是

a = sorted(a, lambda x: x.modified, reverse=True)

8
添加keywoard参数key = lambda x:x.modified将解决问题
shahjapan 2010年

Answers:


342

使用

a = sorted(a, key=lambda x: x.modified, reverse=True)
#             ^^^^

在Python 2.x上,该sorted函数按以下顺序使用其参数:

sorted(iterable, cmp=None, key=None, reverse=False)

因此,如果没有key=,您传入的函数将被视为带有cmp2个参数的函数。


14
您有很好的机会学习从这次体验中获得的关键字参数的价值。
Tony Veijalainen

1
这已经很老了,但是您知道为什么错误代码会误导您吗?您的答案听起来像Python可能要提供lambda另一个参数,因为cmp函数需要2?
SuperBiasedMan

@SuperBiasedMan错误不会引起误解。cmp,比较器函数需要两个参数。如果未指定要传递a key,则从函数参数顺序中假定您正在传递比较器。您的lambda采用一个参数,因此不是有效的比较器,这就是错误的意思。
耶佐

22
lst = [('candy','30','100'), ('apple','10','200'), ('baby','20','300')]
lst.sort(key=lambda x:x[1])
print(lst)

它将打印如下:

[('apple', '10', '200'), ('baby', '20', '300'), ('candy', '30', '100')]

这不适用于字符串整数。看一下这个!lst = [('999','9'),('303','30'),('343','34')] lst.sort(key = lambda x:x [1])print(lst )
丹尼尔·夸

结果为[('303','30'),('343','34'),('999','9')],该结果未基于每个列表中的第二个元素进行排序。
丹尼尔·夸

lst = [('candy','999','9'),('apple','303','30'),('baby','343','34')] lst.sort(key = lambda x:x [2])print(lst)
Daniel Kua

[('apple','303','30'),('baby','343','34'),('candy','999','9')]。哪个也没有基于2个元素排序!
丹尼尔·夸

9

Python列表具有两种内置的数据排序方式:

sort() — A method that modifies the list in-place
sorted() — A built-in function that builds a new sorted list from an iterable

根据您的要求,您可以选择以下两种:

如果要保留原始列表,可以使用排序功能;如果不需要原始列表,则可以使用排序功能。

在进行排序之前,我们需要了解lambda。

lambda是一个匿名函数,一个匿名函数是一个没有名称定义的函数,这篇文章似乎很好地解释了它。

https://www.programiz.com/python-programming/anonymous-function

Lambda函数非常适合内联调用,因为它们只有一个表达式被评估并返回。它们的lambda语法为:

lambda参数:表达式

让我们看看如何使用排序功能:

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

输出:[['dave','B',10),('jane','B',12),('john','A',15)]

在这里,我们可以看到具有元组的列表student_tuples是基于提供为student [2]的关键参数进行排序的。


1

您正在尝试将关键函数与lambda函数一起使用。

Python和其他语言(例如C#或F#)使用lambda函数

另外,关于关键功能以及根据文档

无论list.sort()排序()具有一个关键参数来指定一个函数被调用之前,进行比较每个列表元件上。

...

key参数的值应该是一个采用单个参数并返回用于排序目的键的函数。该技术之所以快捷,是因为对于每个输入记录,键函数仅被调用一次。

因此,键函数具有参数键,并且确实可以接收lambda函数。

Real Python中,有一个很好的用法示例。假设您有以下清单

ids = ['id1', 'id100', 'id2', 'id22', 'id3', 'id30']

并希望对其“整数”进行排序。然后,你会做类似的事情

sorted_ids = sorted(ids, key=lambda x: int(x[2:])) # Integer sort

并打印它会给

['id1', 'id2', 'id3', 'id22', 'id30', 'id100']

在您的特定情况下,您只缺少key=在lambda之前写东西。因此,您需要使用以下内容

a = sorted(a, key=lambda x: x.modified, reverse=True)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.