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

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

我得到这个错误消息:

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

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


这个问题最初是为Python 2.x编写的。在3。TypeError: sorted expected参数为1,got参数为2。


Use

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

在Python 2上。X,排序函数的参数是这样的:

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()和sorted()都有一个关键参数to 在创建之前,指定要在每个列表元素上调用的函数 比较。 ... 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)

输入:[”蒂姆”、“bob”、“安娜”,“乔布斯”,“约翰”,“aaaa”) 输出:[“鲍勃”,“提姆”,“aaaa”,“安娜”,“约翰”,“史蒂夫”)

输入:[”蒂姆”、“bob”、“安娜”,“乔布斯”,“约翰”,“五星级”) 输出:[“鲍勃”,“提姆”,“安娜”,“约翰”,“五星级”,“史蒂夫”)


例2(高级):

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

输出:[‘安娜’,‘zzza’,“五星级”、“鲍勃”、“乔布斯”,“提姆”,“约翰”)


例3(高级):

a = [[1,4],[2,5],[3,1],[1,6],[3,8],[4,9],[0,3],[2,6],[9,5]]
a = sorted(a, key = lambda x:(-x[1],x[0]))
print(a)

输出:[[4,9],[3 8],[1,6],[2,6],[2、5],[9,5],[1,4],[0,3],[3,1]]


结论:

键= lambda x:(p1,p2,p3,p4,…,pn), X是每次输入流中的一个元素。 p1, p2, p3……Pn是需要对元素流进行排序的属性。 根据优先级顺序p1>p2>p3>…>pn。 我们还可以在排序条件之后添加reverse=True,以逆序对元素进行排序。