【问题标题】:Python: Sorting with lambda key confusionPython:使用 lambda 键混淆进行排序
【发布时间】:2021-10-03 20:47:16
【问题描述】:

.sort(key=lambda x: x[0]).sort(key=lambda x: (x[0], -x[1])) 有什么区别。我以为他们都会对列表进行排序。

我尝试了一个例子:

lst = [[2,1], [0,4], [6,7], [3, 5]]
lst.sort(key=lambda x: x[0])
print(last)

>>> [[0, 4], [2, 1], [3, 5], [6, 7]]
lst = [[2,1], [0,4], [6,7], [3, 5]]
lst.sort(key=lambda x: (x[0], -x[1]))
print(last)

>>> [[0, 4], [2, 1], [3, 5], [6, 7]]

在这种情况下,它们的工作原理是相同的。

然而,在这个LeetCode problem 中,当我使用第一种方法 (key=lambda x: x[0]) 时,我得到了错误的答案

当我使用第二种方法 (key=lambda x: (x[0], -x[1])) 时,该解决方案被接受。

我的最终代码如下所示:

class Solution:
    def removeCoveredIntervals(self, intervals: List[List[int]]) -> int:
        # intervals.sort(key=lambda x: x[0])
        intervals.sort(key=lambda x: (x[0], -x[1]))
        last = -1
        removed = 0
        for i in intervals:
            if i[1] <= last:
                removed += 1
            else:
                last = i[1]
        return len(intervals) - removed

另外,我想问题出在以相同左端开头的间隔(如错误答案中)。当我单独尝试那个测试用例时,我得到了这个:

lst = [[1,2], [1,4], [3,4]]
lst.sort(key=lambda x: x[0])
print(last)

>>> [[1, 2], [1, 4], [3, 4]]
lst = [[1,2], [1,4], [3,4]]
lst.sort(key=lambda x: (x[0], -x[1]))
print(last)

>>> [[1, 4], [1, 2], [3, 4]]

不过,右端的顺序似乎有点不同。

【问题讨论】:

  • 我认为它首先寻找子列表的第一个元素,然后是-子列表的第二个元素。然后就是按照那个排序了

标签: python list sorting lambda


【解决方案1】:

lst.sort(key=lambda x: x[0]) 中,您将按每个子列表中的第一个元素对列表进行排序,而忽略其余元素。

lst.sort(key=lambda x: (x[0], -x[1])) 中,您按第一个元素对列表进行排序,如果有两个元素具有相同的值,则排序将由第二个元素完成。

在第二个中sort()-x[1] 表示与第二个元素中的值相反,因此[1, 4] 小于[1, 2],而在第一个排序中,由于只考虑第一个值,因此顺序保持不变。

【讨论】:

  • 感谢您的回答。现在它更有意义了。但是您能否详细说明一下它是如何工作的?过去一段时间,我在其他人的代码中看到了这种技术,我自己也接受了它。
  • @VIVID 你想知道它是如何在内部工作的吗?第一个元素的子列表,如果相等,则考虑键中的第二项。如果你知道 C,源代码是here
【解决方案2】:
lst = [[1,2], [1,4], [3,4]]
lst.sort(key=lambda x: (x[0], -x[1]))
print(last)

这首先检查第一个元素x[0],然后检查减号 x[1],因为有一个- 符号。所以是-x[1]

让我们看看输出:

[[1, 4], [1, 2], [3, 4]]
  • 1 是最小的元素。所以它是第一个。现在,您可能会问为什么不是[1, 2] 是第一个。这是因为- 出现在x[1] 前面。所以第一个变成-4,第二个变成-2
  • 从数学上讲,-4 [1, 4] 先出现,然后是[1, 2]
  • [3, 4], 3 是嵌套列表第一个元素中最大的。

但是,在代码中:

lst = [[1,2], [1,4], [3,4]]
lst.sort(key=lambda x: x[0])
print(last)

您只考虑x[0]。所以列表没有排序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多