如何在Python中使用lambda排序

我试图按属性排序一些值,就像这样:

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

我得到这个错误消息:

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

为什么?我该怎么解决呢?


这个问题最初是为Python 2.x编写的。在3。x,错误消息将是不同的:TypeError: sorted expected 1 argument, got 2

482130 次浏览

使用

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

在Python 2上。x, sorted函数按以下顺序接受参数:

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

所以如果没有key=,你传入的函数将被认为是一个带有2个参数的cmp函数。

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

你试着在函数中使用键函数。

Python和其他语言,如c#或f#使用lambda函数

此外,当涉及到关键函数和根据文档 .

list.sort ()排序()都有一个关键参数to 在创建之前,指定要在每个列表元素上调用的函数 比较。< / p >

...

key形参的值应该是一个函数,该函数接受一个参数并返回一个用于排序的键。这种技术速度很快,因为每个输入记录只调用一次key函数。

键函数有一个参数key它确实可以接收一个函数。

真正的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']

在你的特定情况下,你只需要在lambda之前写key=。所以,你会想用下面的方法

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

在Python3:

    from functools import cmp_to_key
def compare(i1,i2):
return i1-i2
events.sort(key=cmp_to_key(compare))

看一下这个例子,你就会明白:

示例1:

a = input()
a = sorted(a, key = lambda x:(len(x),x))
print(a)

input: ["tim", "bob", "anna", "steve", "john","aaaa"]
输出:['bob', 'tim', 'aaaa', 'anna', 'john', 'steve'] < / p >

input: ["tim", "bob", "anna", "steve", "john","aaaaa"]
输出:['bob', 'tim', 'anna', 'john', 'aaaaa', 'steve'] < / p >


例2(高级):

a = ["tim", "bob", "anna", "steve", "john","aaaaa","zzza"]
a = sorted(a, key = lambda x:(x[-1],len(x),x))
print(a)

输出:['anna', 'zzza', 'aaaaa', 'bob', 'steve', 'tim', 'john']


结论:

< p > key = lambda x:(p1,p2,p3,p4,...,pn),
x每次是输入流中的一个元素。
p1,p2,p3...pn是需要对元素流进行排序的属性。
基于p1>p2>p3>...>pn的优先级顺序。
我们还可以在排序条件之后添加reverse=True,以便对元素进行倒序排序