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

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)

这段代码和之前的代码一样。

我还需要对列表中最短的单词进行同样的操作。

如果这个问题不好,请见谅,这是我的第一个问题。

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)

可以对另一个循环执行相同的操作。

抱歉,我只是在这个问题中使用了列表,并非故意使您困惑。非常感谢您提供的答案。 - Jacobsayshi
3
在开始循环之前,您应该计算出“最大值”和“最小值”。没有必要一遍又一遍地重复计算...... - Matthias

2

您现有的代码实际上可以很容易地进行修改以使其正常工作。不要将单个字符串保存在s中,而是将其保存为一个字符串list。如果您找到一个与先前最长的字符串相同长度的字符串,则append该字符串。如果您找到一个更长的字符串,则丢弃该list并开始一个新的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)

这种方法非常简单且效果很好,我已经发现了。但是有没有一种方法可以适应最短的单词? - Jacobsayshi
1
对于最短的单词 - 我已将p设置为最长单词的长度,但是否有更好的方法来做到这一点,因为最短的单词可能会改变为大于该值。我可以将其设置为100个字符或其他某些值,但看起来有些不太雅观。 - Jacobsayshi
1
如果你需要一个比任何其他数字都要大的数字,可以使用无穷大——在Python中不幸地拼写为float('inf')。否则,你的第二个想法是完全正确的。(在这种情况下,你也可以使用 sys.maxsize,它是最大可能集合的大小。但我认为无穷大更符合惯用法和更明显一些。) - abarnert

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


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)

将产生最短的单词


首先,为什么要使用lambda x: len(x)而不是直接使用len?它们的结果完全相同,但是前者更难读(而且更长、更慢、更容易出错)。其次,OP想要所有长度最短的字符串都被绑定,而不仅仅是3个。 - abarnert
我不知道那个实现,但我仍然在使用过滤器上的lambda。 - Greg

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

OP想要所有长度最短的单词都被绑定,而不是其中的3个。 - abarnert

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接