2011-08-29 39 views
19

这似乎是一个非常简单的问题,但我正在寻找一种简单而又可爱的方式来实现这一点,这仍然可以理解(这不是代码高尔夫)。如何在Python列表中找到最短的字符串

给出一个字符串列表,找到最短字符串的最简单方法是什么?

这是最明显的,以我的方式大致是:

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

,但似乎像很多的代码针对此问题(至少在Python)。

回答

59

The min function有一个可选参数key,它允许您指定一个函数来确定每个项目的“排序值”。我们只是需要将其设置为the len function获得最短值:

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

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

多么明显!我无法相信我错过了这一点。 – leecbaker

+0

看来你可以做min(字符串),因为长度是min默认使用的值 –

+0

@joelgoldstick:这是不正确的。试试'min([“b”,“aa”])'。 –

0

潜在答案:

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

然而,这可能是因为它排序整个列表,这是不必要的效率非常低。我们真的只需要最低限度。

1

我会使用sorted(l, key=len)[0]

+2

这太过分了。除了概念上太复杂的答案之外,排序是'O(n log n)',而'min'是'O(n)'。 – delnan

+0

@delnan我不知道我是否同意“概念复杂”,但我同意使用'min'要好得多(以及稍后发布的reduce版本)。 – carlpett

+3

更不用说对于大量输入而言效率低下,它也是错误的,而是返回_longest_字符串。修正至少... – carlpett

2

注意到线性时间:

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) 
相关问题