2013-02-06 108 views
3


我需要通过一个列表并打印最长的单词。例如,如果有两个单词长度为三个字母,我可以只用一个单词来完成此操作,但无法弄清楚如何打印多个单词。 我试过Python - 从列表中打印多个最短和最长的单词

list.sort (key=len, reverse =True) 
print ("The longest word in the list is: " , list[0]) 

这工作,但只打印第一时间最长的,这是没有好处不止一个最长的单词。

我也试过:

p=0 
for item in list: 
    if len (item) > p: 
     s=item 
     p = len(item) 
print (s) 

这也同前面的代码

我还需要在列表中最短的词做到这一点。

道歉,如果这不是一个好问题,那是我的第一个。

回答

2

您现有的代码实际上可以进行修改而无需太多麻烦。而不是在s中保留单个字符串,请保留list个字符串。如果您发现其长度与前一长度相同,则为append。如果发现更长的时间,请丢弃list并开始一个新的。像这样:

p=0 
s=[] 
for item in lst: 
    if len(item) > p: 
     s=[item] 
     p=len(item) 
    elif len(item) == p: 
     s.append(item) 
print(s) 
+0

这很容易,而且工作得很好,我找到了。但是有没有办法让它适应最短的单词? – Jacobsayshi

+1

对于最短的单词 - 我已经将p设置为最长的单词的长度,但有没有更好的方法来做到这一点,因为最短的单词可以更改为大于此值。我可以将它设置为100,但看起来有点俗气。 – Jacobsayshi

+1

如果你想要一个大于任何其他数字的数字,使用无穷大 - 这在Python中不幸被拼写为'float('inf')''。否则,你的第二个想法是完全正确的。 (在这种情况下,你也可以使用'sys.maxsize',这是最大可能集合的大小,但我认为infinity更具惯用和明显性。) – abarnert

3

首先,不要有史以来使用list作为变量名称,因为它将覆盖内置类型,并可能在稍后造成麻烦。

你可以最长的话这样做:

for i in lst: 
    if len(i) == max(lst, key=len): 
     print(i) 

而且在最短的话:

for i in lst: 
    if len(i) == min(lst, key=len): 
     print(i) 

第一代码打印它们具有相同的长度最长的字符串的字符串。第二个是一样的,但是用最短的字符串。

一个小的优化是预先计算循环前的最大/最小长度,所以你不需要每次重新计算它。

maxLen = max(lst, key=len) 
for i in lst: 
    if len(i) == maxLen: 
     print(i) 

对于其他循环也可以做同样的事情。

+0

对不起,我只是用这个问题列表,非常感谢你的答案。 – Jacobsayshi

+3

在开始循环之前,您应该计算'max'和'min'的值。没有必要一遍又一遍...... – Matthias

+0

@Matthias谢谢你的建议,编辑到我的回答 – Volatility

-1
list.sort (key=len, reverse =True) 
print ("The longest 3 words in the list are: " , list[:3]) 
+0

OP要求所有的单词绑在最短的长度,而不是3。 – abarnert

0

您可以使用字典来收集的话:

results = {} 
for word in words: 
    if len(word) not in results: 
     results[len(word)] = [] 
    results[len(word)].append(word) 

下一页排序字典的键,这是长度和打印的话。这首先打印最长的话,扭转它,删除reverse=True

for i in sorted(results.keys(), reverse=True): 
    print 'Number of words with length {}: {}'.format(i,len(results[i])) 
    for word in results[i]: 
     print word 

仅打印最短和最长:

shortest = sorted(results.keys())[0] 
longest = sorted(results.keys(), reverse=True)[0] 

print 'Shortest words:' 

for word in results[shortest]: 
    print word 

print 'Longest words:' 

for word in results[longest]: 
    print word 
0

可以随时使用lambda函数以及

longest = len(sorted(list, key=len)[-1]) 
filter(lambda item: len(item) == longest, list) 

会产生最长的单词

shortest = len(sorted(list, key=len)[0]) 
filter(lambda item: len(item) == shortest, list) 

会产生最短的词

+0

首先,你为什么要用'lambda x:len(x)'而不是'len'?它具有完全相同的结果,但阅读起来很困难(而且越来越慢,越容易出错)。其次,OP要求所有的字符串并列为最短长度,而不仅仅是3. – abarnert

+0

我不知道这个实现是否公平,但我仍然在过滤器上使用lambda – Greg

1

波动性的答案很好,但让我们看看另一种方式来做到这一点。

如果您不仅按排序顺序列出了该列表,而且还将其分组为相同长度的批次,该怎么办?然后,这将很容易:打印第一组,并打印最后一组。

而且还有附带的Python,做的是分组对你来说,itertools.groupby,所以方便的功能:

l.sort(key=len) # puts them in order 
groups = list(itertools.groupby(l, key=len)) 
print('The shortest words are: {}'.format(groups[0][1]) 
print('The longest words are: {}'.format(groups[-1][1]) 

你可以把它转换成一个班轮:

groups = list(itertools.groupby(sorted(l, key=len), key=len)) 

但是,我不认为我会在这种情况下,重复key=len和所有这些额外的括号使其更难阅读。

同时,您可以避开创建组的整个列表,当你只有真正想要的第一:

l.sort(key=len) 
shortest = itertools.groupby(l, key=len) 
print('The shortest words are: {}'.format(next(shortest)[1])) 
longest = itertools.groupby(reversed(l), key=len) 
print('The longest words are: {}'.format(next(longest)[1])) 

然而,除非list真的是巨大的,我不会担心这一点。