2015-03-29 11 views
5

come faccio a ottenere la persona con il primo cognome nel seguente:Ordina per cognome

l = ['John Fine', 'Doug Biro', 'Jo Ann Alfred'] 
--> Jo Ann Alfred 

Finora stavo facendo:

sorted(l, key=itemgetter(-1))[0] 

È questo il modo consigliato di fare questo o ci sono alternative migliori?

risposta

6

Si sono effettivamente l'ordinamento per l'ultima, non la lettera del nome, presumendo l'ultima parola dopo uno spazio è sempre il cognome uso frazionato:

l = ['John Fine', 'Doug Biro', 'Jo Ann Alfred'] 

sorted(l, key=lambda x: x.rsplit(None,1)[-1]) 

Se si desidera solo il valore minimo in base all'uso cognome min:

print(min(l,key=lambda x: x.rsplit(None,1)[-1])) 

Per l'uso max inverso.

lambda x: x.rsplit(None,1)[-1] divide effettivamente la stringa nell'ultimo spazio vuoto e utilizza tale valore come chiave per l'ordinamento.

4

quando si ha a min, min non sort:

min(l, key=lambda x: x.rsplit(' ', 1)[1])

EDIT:

Penso che una soluzione migliore sarà: 1. confrontare il cognome, e 2. se sono uguali, confrontare il primo. possiamo raggiungere facilmente questo comportamento con le tuple:

min(l, key=lambda x:tuple(reversed(x.rsplit(None, 1))))