Python - 从列表中打印多个最短和最长单词

3 投票
6 回答
6682 浏览
提问于 2025-04-17 14:56


我需要遍历一个列表,并打印出其中最长的单词。我可以做到只找一个单词,但如果有两个单词都是三个字母长,我就不知道怎么打印出两个。

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)

这个和之前的代码是一样的。

我还需要对列表中的最短单词做同样的事情。

如果这个问题不太好,我很抱歉,这是我第一次提问。

6 个回答

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 真的是特别大,不然我觉得没必要太担心这个。

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)

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

2

你的代码其实可以很简单地修改一下,就能正常工作。不要再把所有内容放在一个字符串 s 里,而是用一个 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)

撰写回答