2016-05-09 15 views
10

Sto tentando di restituire una tupla al più piccolo valore dell'indice secondo (valore y) da un elenco di tuple. Se ci sono due tuple con il valore y più basso, selezionare la tupla con il valore x più grande (cioè il primo indice).Restituisce la tupla con il valore y più piccolo dall'elenco delle tuple

Per esempio, supponiamo di avere la tupla:

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

Il valore restituito dovrebbe essere (4, 3). (2, 3) è un candidato, come x[0][1] è 3 (uguale a x[1][1]), tuttavia, x[0][0] è minore di x[1][0].

Finora ho provato:

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

Tuttavia, questo controlla solo il secondo indice, e non confrontare due tuple primo indice se la loro seconda dell'indice sono equivalenti.

+5

Si potrebbe provare qualcosa di simile: 'min (x, key = lambda t: [t [1], -t [0]])' –

risposta

16

Includere il valore x in una tupla restituita dalla chiave; questo secondo elemento nella chiave verrà quindi utilizzato in caso di parità per il valore . Per invertire il confronto (dal più piccolo al più grande), basta negare tale valore:

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

Dopo tutto, -4 è minore di -2.

Demo:

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

Perché il segno meno in '-t [0] '? Questa non è una critica, semplicemente non la capisco ... –

+3

@ByteCommander: perché in un pareggio dovrebbe essere selezionato il valore * larger * 'x', non il più piccolo. –

+0

Grazie, funziona perfettamente. E solo una riga richiesta! – Seb

Problemi correlati