【问题标题】:Some explanation for this lambda function对此 lambda 函数的一些解释
【发布时间】:2021-03-02 10:58:50
【问题描述】:

试图了解如何评估下面的表达式,查看返回的列表:

sorted([1, 2, 3, 4, 5, 6, 7, 8, 9], key=lambda x: abs(2-x))

给出:

[2, 1, 3, 4, 5, 6, 7, 8, 9]

我不确定abs(2-x) 中的x 取什么值。是列表元素的位置[0,1,2,..,8] 还是实际元素的值[1,2,3,.,9]

谁能解释一下?

【问题讨论】:

  • x 是实际值。 2 与 2 最接近,因此排在第一位
  • 啊,我明白了。所以使用abs(2-x)评估列表,然后对结果进行排序?
  • 这是正确的@super_ask

标签: python python-3.x function lambda expression


【解决方案1】:

这是传递给 lambda 的值,它返回用于排序的新“键”。

在这种情况下,lambda 将返回 [1, 0, 1, 2, 3, 4, 5, 6, 7],因此键为 0 的值 2 将移到前面,然后是 1 和 3,这两者都有索引 1,然后是其余的值。

【讨论】:

  • 好的,先生们的解释,我明白了。
【解决方案2】:

x 是实际元素。

写作时:

key=lambda x: abs(2-x)

其实就是这样的:

def sort_key(x):
  return abs(2 - x)

但是在写key=lambda x: abs(2-x)时只有函数体被传递给key

列表:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

当调用lambda 时,它的排序位置受key 的结果影响。

实际排序:

1 -> abs(2 - 1) = (1) [position]
2 -> abs(2 - 2) = (0) [position]
3 -> abs(2 - 3) = (1) [position]
4 -> abs(2 - 4) = (2) [position]
5 -> abs(2 - 5) = (3) [position]
6 -> abs(2 - 6) = (4) [position]
7 -> abs(2 - 7) = (5) [position]
8 -> abs(2 - 8) = (6) [position]
9 -> abs(2 - 9) = (7) [position]

解释:

  • 元素1 给出1,因此它位于索引1
  • 元素2 给出0 所以它定位在索引0
  • 元素3 给出1,因此它位于索引1,但1 已被占用,因此它位于位置1 上的元素旁边
  • 元素4 给出2,因此它位于索引2

....

等等。

【讨论】:

  • abs()用于忽略符号。
  • 很高兴为您提供帮助。
【解决方案3】:

首先:Python内置的sorted函数有签名:

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

意思是如果一个值被传递给key参数,sorted会根据key的值对iterable进行排序。

第二:在这种情况下,key 接受一个函数 (lambda) 并对其进行评估。评估结果与@alexzander 的回答[1,0,1,2,3..7] 相同。 sorted 将其用作 key 以按该顺序对给定列表进行排序(升序,假设 reverse=False 这是默认值)。

【讨论】:

    猜你喜欢
    • 2017-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多