【问题标题】:Is this an efficient way of finding the longest words (plural) in a string?这是在字符串中查找最长单词(复数)的有效方法吗?
【发布时间】:2013-06-01 13:58:13
【问题描述】:

我是 Python 新手,发现了一些关于在字符串中查找最长 WORD 的建议,但没有一个可以解释包含多个匹配最长长度的单词的字符串。

玩了一圈后,我决定了:

inputsentence = raw_input("Write a sentence: ").split()
longestwords = []
for word in inputsentence:
    if len(word) == len(max(inputsentence, key=len)):
        longestwords.append(word)

这样我就有了一个最长的单词列表,我可以用它来做某事。有没有更好的方法呢?

注意:假设 inputsentence 不包含整数或标点符号,只是一系列单词。

【问题讨论】:

    标签: python string python-2.7 words


    【解决方案1】:

    如果您只使用少量文本执行此操作,则无需担心运行时效率:编程效率, 在编码、审查和调试中,重要得多。因此,您拥有的解决方案很好,因为它对于数千个单词来说都是清晰且足够有效的。 (但是,您应该在 for 循环之前只计算一次 len(max(inputsentence, key=len))。)

    但是假设您确实想使用可能有几 GB 长的大型语料库来执行此操作?以下是如何一次性完成,而无需将每个单词都存储在内存中(注意inputcorpus 可能是一个迭代器或分阶段读取语料库的函数):保存所有最长的 个单词。如果您看到一个比当前最大值更长的单词,那么它显然是该长度的第一个单词,因此您可以重新开始列表。

    maxlength = 0
    maxwords = [ ]  # unnecessary: will be re-initialized below
    for word in inputcorpus:
        if len(word) > maxlength:
            maxlength = len(word)
            maxwords = [ word ]
        elif len(word) == maxlength:
            maxwords.append(word)
    

    如果某个最大长度的单词重复,您最终会得到多个副本。为避免这种情况,只需使用 set( ) 而不是列表(并调整初始化和扩展)。

    【讨论】:

    • 太棒了!非常清晰的解释,对我的原作很好的建议编辑,以及澄清效率的好教训。根据原始代码的潜在限制提供替代方案是一个巨大的帮助。不错!
    • 谢谢,你太客气了:-)
    【解决方案2】:

    这个怎么样:

    from itertools import groupby as gb
    
    inputsentence = raw_input("Write a sentence: ").split() 
    
    lwords = list(next(gb(sorted(inputsentence, key=len, reverse=True), key=len))[1])
    

    【讨论】:

      【解决方案3】:

      将其设为defaultdict,以长度为键并修改如下:

      words = inputsentence.split()
      from collections import defaultdict
      dd = defaultdict(list)
      for word in words:
          dd[len(word)].append(word)
      
      key_by_len = sorted(dd)
      print dd[key_by_len[0]]
      

      【讨论】:

      • 为什么 sorted 优于 minmax,或者您可以只跟踪最大长度以提高效率
      • @jamylak 适用于第二大长度等...(或最短)的情况...鉴于用例,sorted 真的不会比最小/最大
      • 感谢乔恩的速度。为了向刚接触编程的人澄清一下,您所描述的方法与我自己的示例相比有什么优势?
      • @user2061277 你每次都在重新计算每个单词的长度
      【解决方案4】:

      希望得到帮助:

      print max(raw_input().split(), key=len)
      

      【讨论】:

        猜你喜欢
        • 2021-05-23
        • 1970-01-01
        • 2018-11-25
        • 1970-01-01
        • 2013-09-10
        • 2011-11-02
        • 2011-07-21
        • 2014-07-31
        • 2013-11-07
        相关资源
        最近更新 更多