【问题标题】:Python - printing multiple shortest and longest words from a listPython - 从列表中打印多个最短和最长的单词
【发布时间】:2013-01-21 10:02:00
【问题描述】:


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

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)

这也和前面的代码一样

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

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

【问题讨论】:

    标签: python arrays list sorting


    【解决方案1】:

    首先,永远不要使用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)
    

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

    【讨论】:

    • 对不起,我只是用列表来回答这个问题,非常感谢你的回答。
    • 您应该在开始循环之前计算maxmin 的值。没有必要一遍又一遍地做......
    • @Matthias 感谢您的建议,将其编辑到我的答案中
    【解决方案2】:
    list.sort (key=len, reverse =True)
    print ("The longest 3 words in the list are: " , list[:3])
    

    【讨论】:

    • OP 希望所有单词的长度最短,而不是 3 个。
    【解决方案3】:

    您可以使用字典来收集单词:

    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
    

    【讨论】:

      【解决方案4】:

      也可以始终使用 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。
      • 我不知道那个实现,很公平,但我仍然在过滤器上使用 lambda
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

        您现有的代码实际上可以修改为工作而没有太多麻烦。不要在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)
        

        【讨论】:

        • 我发现这更容易并且效果很好。但是有没有办法让它适应最短的单词?
        • 对于最短的单词 - 我已经将 p 设置为最长单词的长度,但是有没有更好的方法来做到这一点,因为最短的单词可以更改为大于此值。我可以将其设置为 100,但它看起来有点俗气。
        • 如果你想要一个比任何其他数字都大的数字,请使用无穷大——不幸的是,它在 Python 中拼写为 float('inf')。否则,您的第二个想法是完全正确的。 (在这种情况下,您也可以使用 sys.maxsize,这是可能的最大集合的大小。但我认为,infinity 更为惯用和明显。)
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-04-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-11
        相关资源
        最近更新 更多