2016-07-24 21 views
-1

den folgenden Code Siehe aus der Lösung kopiert 4 von dieser Seite - https://discuss.leetcode.com/topic/50450/slow-1-liner-to-fast-solutions/2:heapq.merge Standardschlüssel?

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

nums2 sind nums1 Listen von Zahlen.

Warum sortiert heapq.merge standardmäßig nach u + v in den Listen [u + v, u, v]? Die u + v's über verschiedene Listen in jedem Generator sind in der Tat in sortierter Reihenfolge (weil nums2 und nums1 in aufsteigender Reihenfolge sind), aber ich bekomme nicht, wie die heap.merge() auf u + v, dem ersten Element, verschmelzen kann der Listen in den len (nums1) Generatoren.

Antwort

1

Es ist nicht nur auf u+v Sortierung, es ist auf der gesamten [u+v, u, v] Liste sortiert. Die Standardmethode, mit der Python zwei geordnete Sammlungen vergleicht, besteht darin, entsprechende Elemente zu vergleichen, beginnend mit dem niedrigsten Index, und zu arbeiten, bis ein Paar entsprechender Elemente ungleich ist. Wenn eine Sequenz kürzer ist als die andere und die längere Sequenz aus der kleineren Sequenz mit zusätzlichen Elementen besteht, wird die längere Sequenz als die größere angesehen.

Das passiert also, wenn Sie ein Paar Strings, Tupel oder Listen vergleichen. Und Sie sollten sicherstellen, dass sich Ihre eigenen benutzerdefinierten Auflistungsobjekte auf die gleiche Weise verhalten.

Dieses Verhalten ist sehr praktisch, wenn komplizierte Art zu tun, da man nur ein entsprechendes Tupel in der key Funktion erstellen müssen, die Sie .sort oder sorted passieren. Es gibt einige Beispiele dafür unter Sort a list by multiple attributes?.