请参阅从本页解决方案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)生成器中的列表。
答案 0 :(得分:1)
它不只是在u+v
上排序,而是在整个[u+v, u, v]
列表上排序。 Python比较两个有序集合的标准方法是通过比较相应的元素,从最低的索引开始并一直工作直到一对相应的元素不相等。如果一个序列比另一个序列短,而较长的序列由具有额外元素的较小序列组成,则较长的序列被认为是更大的序列。
这就是比较一对字符串,元组或列表时会发生什么。您应该确保自己的自定义集合对象的行为方式相同。
这种行为在进行复杂排序时非常方便,因为您只需要在传递给key
或.sort
的{{1}}函数中创建一个合适的元组。在Sort a list by multiple attributes?处有一些例子。