3


我需要浏览一个列表并打印其中最长的单词。我可以只为一个单词执行此操作,但不知道如何打印多个单词,例如,如果有两个单词的长度为三个字母。我试过了

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)

这也和前面的代码一样

我还需要为列表中最短的单词执行此操作。

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

4

6 回答 6

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)

另一个循环也可以这样做。

于 2013-02-06T09:06:23.323 回答
2

您现有的代码实际上可以修改为没有太多麻烦。不要在 中保留单个字符串,而是s保留 a listof 字符串。如果你找到一个与之前最长的长度相同的,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)
于 2013-02-06T09:40:25.390 回答
1

Volatility 的答案很好,但让我们看看另一种方法来做到这一点。

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

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它真的很大,否则我不会担心这个。

于 2013-02-06T09:31:29.497 回答
0

您可以使用 dict 来收集单词:

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
于 2013-02-06T09:13:48.873 回答
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)

将产生最短的单词

于 2013-02-06T09:24:19.813 回答
-1
list.sort (key=len, reverse =True)
print ("The longest 3 words in the list are: " , list[:3])
于 2013-02-06T09:06:39.133 回答