我试图按属性排序一些值,就像这样:
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。
我试图按属性排序一些值,就像这样:
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。
当前回答
看一下这个例子,你就会明白:
示例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,以逆序对元素进行排序。
其他回答
看一下这个例子,你就会明白:
示例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,以逆序对元素进行排序。
在Python3:
from functools import cmp_to_key
def compare(i1,i2):
return i1-i2
events.sort(key=cmp_to_key(compare))
你试着在函数中使用键函数。
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)
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')]
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函数。