这是在字符串中查找最长单词(复数)的有效方法吗?

2024-09-24 22:22:12 发布

您现在位置:Python中文网/ 问答频道 /正文

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

玩完之后,我决定:

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

这样我就有了一个最长的单词列表,我可以用它来做一些事情。有更好的办法吗?在

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


Tags: 字符串inforinputrawlen单词建议
3条回答

如果您只使用少量的文本来完成这项工作,则无需担心运行时效率:编程效率,在编码、审查和调试中,要重要得多。所以你的解决方案是好的,因为它是清晰的,足够有效的,甚至数千字。(但是,您应该在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( )而不是列表(并调整初始化和扩展)。在

将其设为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]]

这个怎么样:

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])

相关问题 更多 >