2012-11-15 20 views
13

Eventuali duplicati:
Python’s most efficient way to choose longest string in list?Python: lunghezza della sottolista più lunga?

Ho una lista L

L = [[1,2,3],[5,7],[1,3],[77]] 

voglio tornare alla lunghezza della sottolista più lungo senza bisogno di ciclo tra di loro, in questo caso 3 perché [1,2,3] è di lunghezza 3 ed è il più lungo dei quattro sottolisti. Ho provato len (max (L)) ma questo non fa quello che voglio. Un modo per farlo o è un loop il mio unico modo?

+0

DUP di http://stackoverflow.com/q/873327/1180720 – gefei

risposta

33

max(L,key=len) vi darà l'oggetto con la lunghezza più lunga ([1,2,3] nel tuo esempio) - per ottenere effettivamente la lunghezza (se questo è tutto ciò che interessa), si può fare len(max(L,key=len)) che è un po 'brutto - mi piacerebbe rompilo su 2 linee. Oppure puoi utilizzare la versione fornita da ecatamur.

Tutte queste risposte hanno cicli - nel mio caso, i loop sono impliciti che di solito significa che verranno eseguiti in un codice macchina nativo ottimizzato. Se ci pensi, come hai potuto sapere quale elemento è il più lungo senza guardare a ciascuno?


Infine, ricordiamo che key=function non è una caratteristica che è specifico per max. Molti dei builtin python (max, min, sorted, itertools.groupby, ...) utilizzano questo particolare argomento di parole chiave. Vale sicuramente la pena investire un po 'di tempo per capire come funziona e cosa fa in genere.

+0

Come funziona? Ah ok quindi non c'è modo di evitarlo? Va bene grazie! – IAmBatman

+0

@IAmBatman Hai letto la documentazione di 'max'? Sei consapevole che le funzioni sono valori di prima classe (il che significa, tra le altre cose, che possono essere passati ad altre funzioni come argomenti)? – delnan

+0

@IAmBatman - 'max' applica la funzione' chiave' a ciascun elemento dell'elenco e seleziona quello in cui la funzione 'chiave' ha restituito la più grande. – mgilson

10

Prova la comprensione:

max(len(l) for l in L) 
+0

L'utilizzo della parola chiave 'key' è più veloce, credo. –

+0

@MartijnPieters Probabile, visto che è in C (e in alcuni casi PyPy ha problemi ad ottimizzare le espressioni del generatore). Ma non è per questo che lo raccomanderei. E 'anche più chiaro per me (ma va bene anche questo, e ho notato che mi spingo più verso la programmazione funzionale di molti programmatori Python). – delnan

+0

@MartijnPieters - Ci sono differenze molto sottili. 'max (L, key = len)' dà all'oggetto il più grande 'len', ma non ti dà la sua lunghezza :) – mgilson

Problemi correlati