2011-08-29 7 views
19

Questo sembra un problema piuttosto semplice, ma sto cercando un modo breve e dolce di farlo che sia ancora comprensibile (non si tratta di codice golf).Come trovare la stringa più breve in un elenco in Python

Dato un elenco di stringhe, qual è il modo più semplice per trovare la stringa più breve?

Il modo in cui è più evidente per me è più o meno:

l = [...some strings...] 
lens = map(l, len) 
minlen, minind = min(lens) 
shortest = l[minind] 

ma che sembra un sacco di codice per questo problema (almeno in python).

risposta

59

The min function ha un parametro opzionale key che consente di specificare una funzione per determinare il "valore di ordinamento" di ciascun elemento. Abbiamo solo bisogno di impostare questo per the len function per ottenere il valore più breve:

strings = ["some", "example", "words", "that", "i", "am", "fond", "of"] 

print min(strings, key=len) # prints "i" 
+5

Come ovvio! Non posso credere di aver perso questo. – leecbaker

+0

Sembra che tu possa fare min (stringhe) poiché la lunghezza è quella che min userà di default –

+0

@joelgoldstick: non è corretto. Prova 'min ([" b "," aa "])'. –

0

risposta Potenziale:

l = [...some strings...] 
l.sort(key=len) 
shortest = l[0] 

Tuttavia, questo è probabilmente molto inefficiente in quanto ordina l'intero elenco, che è inutile. Abbiamo davvero bisogno del minimo.

1

userei sorted(l, key=len)[0]

+2

Questo è eccessivo. Oltre ad essere concettualmente troppo complesso di una risposta, l'ordinamento è 'O (n log n)' mentre 'min' è' O (n) '. – delnan

+0

@delnan Non so se sono d'accordo con "concettualmente complesso", ma sono d'accordo che usare 'min' è molto meglio (e anche la variante di riduzione pubblicata più tardi). – carlpett

+3

Per non dire inefficiente per input di grandi dimensioni, era anche sbagliato, restituendo invece la stringa _longest_. Risolto che almeno ... – carlpett

2

richiede tempo lineare:

reduce(lambda x, y: x if len(x) < len(y) else y, l) 
-1
arr=('bibhu','prasanna','behera','jhgffgfgfgfg') 
str1='' 

#print (len(str)) 
for ele in arr: 
    print (ele,ele[::-1]) 
    if len(ele)>len(str1): 
     str1=ele 
    elif len(ele)<len(str2): 
     str2=ele 
print ("the longest element is :",str1) 
str2=arr[0] 
for ele in arr: 
    if len(ele)<len(str2): 
     str2=ele 

print ("the shortest element is :",str2) 
Problemi correlati