2016-05-09 13 views
10

Ich versuche ein Tupel aus einer Liste von Tupeln mit dem kleinsten zweiten Indexwert (y-Wert) zurückzugeben. Wenn es zwei Tupel mit dem niedrigsten y-Wert gibt, dann wähle das Tupel mit dem größten x-Wert (d. H. Ersten Index).Rückgabetupel mit kleinstem y-Wert aus Tupelliste

Zum Beispiel nehme ich an das Tupel haben:

x = [(2, 3), (4, 3), (6, 9)] 

Der Wert sollte (4, 3) sein zurückgegeben. (2, 3) ist ein Kandidat, wie x[0][1] ist 3 (das gleiche wie x[1][1]), jedoch x[0][0] ist kleiner als x[1][0].

Bisher habe ich versucht:

start_point = min(x, key = lambda t: t[1]) 

aber nur, prüft der zweite Index, und nicht vergleichen zwei Tupel erste Index, wenn deren zweite Index gleichwertig sind.

+5

Sie könnten versuchen, so etwas wie: 'min (x, key = Lambda-t: [t [1], -t [0]])' –

Antwort

16

Fügen Sie den Wert x in ein Tupel ein, das vom Schlüssel zurückgegeben wird. Dieses zweite Element im Schlüssel wird dann verwendet, wenn für den Wert y ein Gleichstand vorliegt. Um den Vergleich zu inversen (vom kleinsten zum größten), negiert nur diesen Wert:

min(x, key=lambda t: (t[1], -t[0])) 

Immerhin -4 kleiner als -2.

Demo:

>>> x = [(2, 3), (4, 3), (6, 9)] 
>>> min(x, key=lambda t: (t[1], -t[0])) 
(4, 3) 
+0

Warum das Minus in '-t [0] '? Das ist keine Kritik, ich verstehe es einfach nicht ... –

+3

@ByteCommander: weil bei einer Krawatte der * größere * 'x'-Wert gewählt werden sollte, nicht der kleinere. –

+0

Danke, funktioniert perfekt. Und nur eine Zeile benötigt! – Seb

Verwandte Themen