You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何最高效地移除字符串中长度小于x的末尾单词?

现有实现的问题

你贴的代码首先有个运行时bug:input.split()[-1]取到的是字符串类型,直接和整数3做大小比较在Python3里会直接抛类型错误,实际是跑不通的,你测试的时候应该是漏写了len(),正确判断应该是取最后一个单词的长度和阈值比较。

从效率角度说,现有实现的冗余开销非常大:

  • 你调用了两次split(),每次调用都会从头扫描整个字符串,把所有单词切分成列表,相当于把整个字符串处理了两遍
  • 哪怕你把两次split()合并成一次,全量分割的逻辑依然做了很多无用功:我们的需求只需要判断最后一个单词的长度,根本不需要关心前面的单词是什么、有多少个,为了末尾几个字符去遍历处理整个字符串,在长文本场景下浪费非常多性能。
  • 分割后再用' '.join()拼接的过程也会产生额外的临时列表和字符串内存开销。
更高效的实现方案

最优思路完全不需要做全串分割,直接从字符串末尾向前遍历即可,只需要处理末尾少量字符就能得到结果,时间复杂度和字符串总长度无关,只和最后一个单词的长度挂钩,长文本下性能提升非常明显。

实现逻辑:

  1. 从字符串尾部开始,先跳过末尾可能存在的连续空白字符(兼容末尾带空格、多空格分隔的场景,如果你的输入严格保证单词间单空格、末尾无空格可以省略这步)
  2. 继续向前遍历,直到碰到第一个空白字符或者走到字符串开头,统计得到最后一个单词的长度
  3. 如果最后一个单词长度小于阈值3,直接截取开头到最后一个空白字符之前的内容返回;如果长度达标,直接返回原字符串即可。

对应代码:

def fun(input_str: str, threshold: int = 3) -> str:
    str_len = len(input_str)
    idx = str_len - 1

    # 跳过末尾空白
    while idx >= 0 and input_str[idx].isspace():
        idx -= 1
    if idx < 0:
        return ""
    
    # 定位最后一个单词的左边界
    last_word_end = idx
    while idx >= 0 and not input_str[idx].isspace():
        idx -= 1
    
    last_word_length = last_word_end - idx
    if last_word_length < threshold:
        # 截取后去掉末尾可能残留的空格
        return input_str[:idx].rstrip()
    return input_str


# 测试用例
a = "first one is"
b = "the second forever"
print(fun(a)) # 输出: first one
print(fun(b)) # 输出: the second forever
性能差异说明
  • 短字符串场景下,两种实现的速度差异感知不强,但如果输入是几十万字的长文本,比如总长度1M、最后一个单词只有2个字符,原split实现需要遍历全部1M内容完成分割、再拼接新字符串,优化后的实现只需要从后往前扫描不到10个字符就能返回结果,性能差距可以达到上万倍。
  • 优化后的实现全程不需要生成额外的单词列表,也不需要做拼接操作,内存开销也远低于split实现。

内容的提问来源于stack exchange,提问作者SantoshGupta7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.03 03:16:06