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

bpsygsoo  于 2022-12-25  发布在  Python
关注(0)|答案(5)|浏览(141)

我尝试按属性对一些值进行排序,如下所示:

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

我收到此错误消息:

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

为什么?我要怎么补救?
这个问题最初是为Python 2.x编写的,在Python 3.x中,错误消息会有所不同:TypeError: sorted expected 1 argument, got 2.

soat7uwm

soat7uwm1#

用途

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

在Python 2.x中,sorted函数按照以下顺序获取参数:

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

因此,如果没有key=,传入的函数将被视为cmp函数,它有两个参数。

ffscu2ro

ffscu2ro2#

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

omtl5h9j3#

你试图在lambda函数中使用key函数。
Python和其他语言如C#或F#使用lambda functions
此外,在关键功能方面,根据documentation
list.sort()和sorted()都有一个关键参数,用于指定在进行比较之前对每个列表元素调用的函数。
...
key参数的值应该是一个函数,该函数接受一个参数并返回一个用于排序的键。这种技术速度很快,因为key函数对每条输入记录只调用一次。
所以,key函数有一个参数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']

在您的特定情况下,您只需要在lambda之前写入key=

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

kdfy810k4#

在Python 3中:

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

m4pnthwp5#

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

    • 示例1:**
a = input()
a = sorted(a, key = lambda x:(len(x),x))
print(a)

输入:["tim", "bob", "anna", "steve", "john","aaaa"]
输出:['bob', 'tim', 'aaaa', 'anna', 'john', 'steve']
输入:["tim", "bob", "anna", "steve", "john","aaaaa"]
输出:['bob', 'tim', 'anna', 'john', 'aaaaa', 'steve']

    • 示例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']

    • 示例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]]

    • 结论:**

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

相关问题