Python:使用lambda键进行排序的困惑

3
.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问题中,当我使用第一种方法(key=lambda x: x[0])时,我得到了错误的答案。

enter image description here

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

enter image description here

我的最终代码如下:

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]]

虽然看起来似乎右端点的顺序有点不同。


我认为它首先查找子列表的第一个元素,然后是子列表的第二个元素。然后根据这个排序。 - user15801675
2个回答

1
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 < -2,所以[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]。所以该列表未排序。


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
1
@VIVID,你想了解它内部的工作原理吗?它通过第一个元素对子列表进行排序,如果相等,则考虑键中的第二个项目。如果你懂C语言,源代码在这里 - Guy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接