【问题标题】:Python beginner - Sorting tuples using lambda functionsPython 初学者 - 使用 lambda 函数对元组进行排序
【发布时间】:2017-02-09 06:44:11
【问题描述】:

我正在阅读 Python 的教程介绍,但我一直在理解一段代码。这来自本教程的第 4.7.5 节。

pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
pairs.sort(key=lambda pair: pair[1])
pairs

这段代码返回

[(4, 'four'), (1, 'one'), (3, 'three'), (2, 'two')]

所以在第一行,它用不同元组的列表定义了对。我明白了。 第二行是我完全被抛弃的地方,我已经做了很多事情来试图理解发生了什么。

我发现 sort() 正在将内置函数应用于变量对,并且大概是按照我给它的指令对其进行排序。

sort() 函数需要一个键,而键必须使用函数来定义,因此使用了 lambda。我认为所有这些都是正确的,但我可能离这里很远。

Lambda定义了一个新的参数,冒号左边是“pair”,右边是定义lambda函数返回值的计算。

这就是我被抛弃的地方。 “对[1]”有什么作用?它对结肠左侧的“对”有什么影响?

它返回什么值?除了像这样编码之外,我似乎无法让它返回任何类型的值。

我猜它以某种方式指向一个特定的元组并根据重新定位对其进行排序,但我不确定其背后的逻辑。

谁能帮我解释一下?谢谢。

【问题讨论】:

  • 使用lambda,您可以引用需要排序的值。
  • 如果您先调用key = lambda pair: pair[1],然后调用key(pairs[0]) 并将其与key(pairs[1]) 进行比较,会有帮助吗?如果我告诉你最终结果是按每个元组的第二个元素的字母顺序排序的呢?

标签: python sorting lambda


【解决方案1】:

有时当开始使用lambda 时,明确地写出函数会更容易。您的 lambda 函数相当于:

def sort_key(pair):
    return pair[1]

如果我们想要更详细,我们可以解包 pair 使其更加明显:

def sort_key(pair):
    int_value, string_value = pair
    return string_value

因为list.sort 根据key 函数(如果存在)的返回值对项目进行排序,现在我们看到它是根据它们的字符串值 对元组进行排序。由于字符串按字典顺序排序,"four" 排在"one" 之前(考虑字母顺序)。

【讨论】:

    【解决方案2】:

    lambda 是一个简化函数,只使用一个表达式。

    任何 lambda 都可以写成函数,通过在表达式前添加 return,所以 lambda pair: pair[1] 变为:

    def lambda_function(pair): return pair[1]
    

    所以这里list.sort()调用中的lambda返回传入的每个序列的second元素(Python索引从0开始)。

    您可以通过将 lambda 分配给变量来使其可见,例如,key

    >>> pairs = [(1, 'one'), (2, 'two'), (3, 'three'), (4, 'four')]
    >>> key = lambda pair: pair[1]
    >>> key(pairs[0])
    'one'
    >>> key(pairs[1])
    'two'
    

    list.sort() 方法使用这些调用的输出(列表中的每个元素一次)对元素进行排序。因此对于这 4 个元素,该函数返回 'one''two''three''four',然后这 4 个元组完全按照这 4 个字符串的字典(字母)顺序进行排序。该顺序将是'four''one''three''two',这就是您在最终排序列表中看到的内容。

    这种按替代键排序的形式通常称为Schwartzian transform,以在 Perl 中推广该技术的 Randal L. Schwartz 命名。

    【讨论】:

      【解决方案3】:

      您的 lambda 函数将一个元组作为输入并返回索引为 1 的元素(因此,自第一个元素以来的第二个元素的索引为 0)。 所以排序只会考虑每个元组的第二个元素(英文单词)。这就是为什么你的输出在第二个元素'four'>'one'>'three'>'two'中按字母顺序排序的原因@

      【讨论】:

      • 非常感谢。我已经盯着这个看了好几个小时了。我认为它指向“pairs”变量中的位置(一旦我的想法停留在那个位置,就没有回来了,不是元组的位置。现在更有意义了。谢谢!
      猜你喜欢
      • 1970-01-01
      • 2017-08-17
      • 1970-01-01
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 2020-12-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多