2011-08-29 6 views
19

Esto parece un problema bastante simple, pero estoy buscando una forma breve y dulce de hacerlo que sea comprensible (esto no es código de golf).Cómo encontrar la cadena más corta en una lista en Python

Dada una lista de cadenas, ¿cuál es la forma más fácil de encontrar la cadena más corta?

La forma en que es más obvio para mí es más o menos:

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

pero que parece como un montón de código para este problema (al menos en Python).

Respuesta

59

The min function tiene un parámetro opcional key que le permite especificar una función para determinar el "valor de clasificación" de cada elemento. Sólo tenemos que ponga esto en the len function para obtener el valor más corto:

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

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

Cómo obvio! No puedo creer que me haya perdido esto. – leecbaker

+0

Parece que puede hacer min (cadenas) ya que la duración es lo que min usará de manera predeterminada –

+0

@joelgoldstick: Eso es incorrecto. Pruebe 'min ([" b "," aa "])'. –

0

respuesta Potencial:

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

Sin embargo, esto es probablemente muy ineficiente, ya que ordena la lista entera, lo cual es innecesario. Realmente solo necesitamos el mínimo.

1

que haría uso de sorted(l, key=len)[0]

+2

Eso es exagerado. Además de ser una respuesta demasiado compleja desde el punto de vista conceptual, la clasificación es 'O (n log n)' mientras que 'min' es' O (n) '. – delnan

+0

@delnan No sé si estoy de acuerdo con "conceptualmente complejo", pero estoy de acuerdo en que usar 'min' es mucho mejor (y también la variante de reducción publicada más adelante). – carlpett

+3

Sin mencionar que es ineficiente para grandes entradas, también fue incorrecto, devolviendo la cadena _longest_ en su lugar. Se corrigió eso al menos ... – carlpett

2

Toma tiempo lineal:

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) 
Cuestiones relacionadas