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

Nik*_*ntz 149 python lambda

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

<lambda>() takes exactly 1 argument (2 given)
Run Code Online (Sandbox Code Playgroud)

我的路线是

a = sorted(a, lambda x: x.modified, reverse=True)
Run Code Online (Sandbox Code Playgroud)

ken*_*ytm 285

使用

a = sorted(a, key=lambda x: x.modified, reverse=True)
#             ^^^^
Run Code Online (Sandbox Code Playgroud)

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

sorted(iterable, cmp=None, key=None, reverse=False)
Run Code Online (Sandbox Code Playgroud)

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

  • 您有很好的机会学习如何通过这种体验来欣赏关键字参数. (11认同)
  • 也是list.sort(key = key)的正确答案 (2认同)
  • Python 2 和 3 似乎有不同的函数声明。我使用Python 3,所以不再有cmp。在Python2中,它是一个“iterable”,在Python 3中它是什么? (2认同)

小智 10

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

它将打印如下:

[('apple', '10', '200'), ('baby', '20', '300'), ('candy', '30', '100')]
Run Code Online (Sandbox Code Playgroud)

  • @DanielKua 这很容易修复。您可以只执行“int(x[1])”,而不仅仅是“x[1]”。 (2认同)

Alb*_*ews 9

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

示例1:

a = input()
a = sorted(a, key = lambda x:(len(x),x))
print(a)
Run Code Online (Sandbox Code Playgroud)

输入["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)
Run Code Online (Sandbox Code Playgroud)

输出:['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)
Run Code Online (Sandbox Code Playgroud)

输出:[[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,对元素进行逆序排序。


Jam*_* L. 8

在Python3中:

from functools import cmp_to_key
def compare(i1,i2):
  return i1-i2
events.sort(key=cmp_to_key(compare))
Run Code Online (Sandbox Code Playgroud)


Tia*_*ica 7

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

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

此外,当涉及到关键功能时,根据文档

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

...

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

所以,键函数有一个参数键,它确实可以接收一个 lambda 函数。

Real Python 中有一个很好的例子说明它的用法。假设您有以下列表

ids = ['id1', 'id100', 'id2', 'id22', 'id3', 'id30']
Run Code Online (Sandbox Code Playgroud)

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

sorted_ids = sorted(ids, key=lambda x: int(x[2:])) # Integer sort
Run Code Online (Sandbox Code Playgroud)

并打印它会给

['id1', 'id2', 'id3', 'id22', 'id30', 'id100']
Run Code Online (Sandbox Code Playgroud)

在您的特定情况下,您只是缺少key=在 lambda 之前编写。所以,你想使用以下

a = sorted(a, key=lambda x: x.modified, reverse=True)
Run Code Online (Sandbox Code Playgroud)