Python lambda函数对元组列表进行排序

2 python sorting functional-programming

最初,元组列表按其第二个值和第三个值排序。

tlist = [('a', 1, 14), ('a', 1, 16), ('b', 1, 22), 
        ('a', 2, 1), ('c', 2, 9), ('d', 2, 11), ('d', 2, 12)]
Run Code Online (Sandbox Code Playgroud)

尝试按第二个值对这个元组列表进行排序,按第三个值反转;也就是说,希望 的输出list像这样排序:

tlist= [('b', 1, 22), ('a', 1, 16), ('a', 1, 14), 
        ('d', 2, 12), ('d', 2, 11), ('c', 2, 9), ('a', 2, 1)]
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我在这个答案中看到的尝试:

tlist = sorted(tlist, key=lambda t: return (t[0], t[1], -t[2]))
Run Code Online (Sandbox Code Playgroud)

但它不起作用;给出一个return outside of function错误。

关于如何获得所需输出的任何想法?

编辑

这个问题提供了非常好的资源,也许所有人都需要继续解决我的具体问题。但是,鉴于我的经验水平较低,并且我使用不同的排序标准进行排序的具体实例(如上面的描述所述),我认为这不是重复的。

Wil*_*sem 5

一个lambda表达式不使用return的语句。因此,您应该删除return关键字。

您似乎也首先对元组的第一个元素进行排序。为了只取第二个元素并使用第三个元素的降序作为决胜局,您应该将 lambda 重写为:

lambda t: (t[1],-t[2])
Run Code Online (Sandbox Code Playgroud)

或者把它们放在一起:

tlist = sorted(tlist, key=lambda t: (t[1],-t[2]))
Run Code Online (Sandbox Code Playgroud)

运行此python3生成:

>>> tlist= [('b', 1, 22), ('a', 1, 16), ('a', 1, 14), 
...         ('d', 2, 12), ('d', 2, 11), ('c', 2, 9), ('a', 2, 1)]
>>> tlist = sorted(tlist, key=lambda t: (t[1],-t[2]))
>>> list(tlist)
[('b', 1, 22), ('a', 1, 16), ('a', 1, 14), ('d', 2, 12), ('d', 2, 11), ('c', 2, 9), ('a', 2, 1)]
Run Code Online (Sandbox Code Playgroud)