2015-07-15 7 views
6

Ich mag eine 2D-Liste sortieren, wobei jede „Reihe“ von Größe 2, wie das zum BeispielSortierte Funktion vergleichen mit der Funktion

[[2,5],[2,3],[10,11]] 

Diese Zeilen reichen in der Tat darstellen, so dass sie immer [a wo b] a = b <

ich mag es genau diese Art und Weise sortieren, wobei jedes Element der Liste, um eine 2-Liste ist, würde ich (nach der Reihenfolge ihrer Priorität): [a1, b1] verglichen zu [a2, b2]

1. If a1 < a2 do not permute 
2. If a1 > a2 permute 
3. If a1 == a2 then permute if (b1 - a1) > (b2 - a2) 

Was ich irgendwie dumm finde ist, dass Python keine Vergleichsfunktionen mehr zulässt. Stattdessen verwendet es eine Schlüsselfunktion. Theres keine Weise kann ich einen gültigen Schlüssel damit bilden, während ich meinen Vergleich auf zwei Parametern gründe, den numerischen Wert von 'a' (was vorherrscht) und dann Länge des Bereichs (b - a).

Wie kann ich das sortieren? Ich meine, ohne zwei mal sortierte() oder sowas zu nennen, was meiner Meinung nach hässlich ist.

Ist es überhaupt möglich? Oder gibt es etwas, das ich nicht sehe?

Danke!

+0

machen zurückkehren Wenn sortiert aufzurufen (Elemente, cmp = func) auf Python 3.3.3 gibt es mir „‚cmp‘ist ein ungültiges Schlüsselwort-Argument für diese Funktion“ – Yannick

+0

Die [docs] (https://docs.python.org/3/howto/sorting.html) bietet eine Konvertierungsfunktion 'cmp' zu' key', ist aber nicht so hübsch. –

+1

Sie können auch eine Klasse für innere Liste erstellen und überschreiben ['__cmp__'] (https://docs.python.org/2/reference/datamodel.html#object.__cmp__) Funktion –

Antwort

5

Es gibt Fälle, die nicht von einem key behandelt werden können. Dies ist keiner von ihnen. Die Lösung ist auf die Schlüsselfunktion ein tuple

>>> L = [[2, 5], [2, 3], [10, 11]] 
>>> sorted(L, key=lambda x:(x[0], x[1] - x[0])) 
[[2, 3], [2, 5], [10, 11]] 
+0

Ich bin neugierig auf Fälle, die nicht können mit 'key' gelöst werden. Hast du ein Beispiel, bitte? – Delgan

+0

Vielen Dank! Ich zweiten @Delgan, wäre schön zu wissen, welche Fälle nicht gelöst werden können (ich wusste nicht, Tupel war eine funktionierende Lösung) – Yannick

+0

@Delgan, Angenommen, die Liste der Unterlisten waren '[Vorname, Nachname]' Ich muss nach Nachnamen sortieren. Wo die Nachnamen gleich sind, muss ich nach dem Vornamen sortieren - aber umgekehrt. –

Verwandte Themen