【问题标题】:How to sort with lambda in Python如何在 Python 中使用 lambda 进行排序
【发布时间】:2011-04-15 13:30:36
【问题描述】:

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

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

我的行是

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

【问题讨论】:

  • 添加关键字参数 key = lambda x: x.modified 即可解决问题

标签: python sorting functional-programming anonymous-function


【解决方案1】:

使用

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

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

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

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

【讨论】:

  • 你有很好的机会从这次经历中学会欣赏关键字参数传递。
  • 这已经很老了,但是你知道为什么错误代码会误导吗?您的回答听起来可能 Python 正在为 lambda 提供另一个参数,因为 cmp 函数需要 2?
  • @SuperBiasedMan 该错误不会误导。 cmp,比较器函数有两个参数。如果您未指定传递key,则从函数参数顺序假定您传递的是比较器。您的 lambda 采用一个参数,因此不是有效的比较器,这就是错误所说的。
  • Python 2 和 3 似乎有不同的函数声明。我使用 Python 3,所以不再有 cmp。在 Python2 中是iterable,在 Python 3 中是什么?
【解决方案2】:
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')]

【讨论】:

  • 这不适用于字符串整数。看一下这个! lst = [('999', '9'), ('303', '30'), ('343', '34')] lst.sort(key=lambda x: x[1]) print(lst )
  • 结果是 [('303', '30'), ('343', '34'), ('999', '9')] 不是按秒排序的每个列表中的元素。
  • lst = [('candy','999','9'), ('apple','303','30'), ('baby','343','34 ')] lst.sort(key=lambda x:x[2]) print(lst)
  • [('apple', '303', '30'), ('baby', '343', '34'), ('candy', '999', '9') ]。哪个也不是基于 2 个元素排序的!
  • @DanielKua 这很容易解决。你可以只做int(x[1]) 而不是x[1]
【解决方案3】:

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

Python 和 C# 或 F# 等其他语言使用 lambda functions

另外,当涉及到关键功能时,根据documentation

list.sort()sorted() 都有一个关键参数 在制作之前指定要在每个列表元素上调用的函数 比较。

...

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)

【讨论】:

    【解决方案4】:

    在 Python3 中:

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

    【讨论】:

      【解决方案5】:

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

      例 1: a = 输入()

      a = sorted(a, key = lambda x:(len(x),x)) 打印(一)

      输入:[“蒂姆”、“鲍勃”、“安娜”、“史蒂夫”、“约翰”、“aaaa”] 输出:['bob', 'tim', 'aaaa', 'anna', 'john', 'steve']

      输入:[“蒂姆”、“鲍勃”、“安娜”、“史蒂夫”、“约翰”、“aaaaa”] 输出:['bob', 'tim', 'anna', 'john', 'aaaaa', 'steve']


      示例 2(高级):

      a = [“蒂姆”、“鲍勃”、“安娜”、“史蒂夫”、“约翰”、“aaaaa”、“zzza”]

      a = sorted(a, key = lambda x:(x[-1],len(x),x)) 打印(一)

      输出:['anna', 'zzza', 'aaaaa', 'bob', 'steve', 'tim', 'john']

      ================================================ =================

      结论: 键 = λ x:(p1,p2,p3,p4,...,pn), x 是输入流中的一个元素。 p1,p2,p3...pn 是需要对元素流进行排序的属性。 基于 p1>p2>p3>...>pn 的优先级顺序。 我们也可以在排序条件后面加上reverse=True,对元素进行倒序排序。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-10-03
        • 1970-01-01
        • 2022-11-29
        • 2019-11-26
        • 1970-01-01
        • 1970-01-01
        • 2014-07-05
        • 1970-01-01
        相关资源
        最近更新 更多