heapq.merge 默认密钥?

heapq.merge default key?

参考从本页解决方案 4 复制的以下代码 - https://discuss.leetcode.com/topic/50450/slow-1-liner-to-fast-solutions/2:

    streams = map(lambda u: ([u+v, u, v] for v in nums2), nums1)
    stream = heapq.merge(*streams)

nums2, nums1 是数字列表。

为什么 heapq.merge 默认按 [u+v, u, v] 列表中的 u+v 排序?每个生成器中不同列表中的 u+v 确实是按排序顺序排列的(因为 nums2 和 nums1 是按升序排列的),但我不明白 heap.merge() 是如何知道在 u+v 上合并的, len(nums1) 生成器中列表的第一个元素。

它不仅对 u+v 进行排序,它还对整个 [u+v, u, v] 列表进行排序。 Python 比较两个有序集合的标准方法是比较相应的元素,从最低的索引开始,直到一对相应的元素不相等。如果一个序列比另一个短,并且较长的序列由较小的序列和额外的元素组成,则认为较长的序列更大。

这就是当您比较一对字符串、元组或列表时会发生的情况。并且您应该确保您自己的自定义集合对象的行为方式相同。

这种行为在进行复杂排序时非常方便,因为您只需要在传递给 .sortsortedkey 函数中创建一个适当的元组。在 Sort a list by multiple attributes?.

有一些这样的例子