Python字符串处理:查找句中最短单词代码结果不符求助
问题排查与正确实现
原代码逻辑错误点
- 长度比较逻辑完全偏离需求:循环判断条件写为
len(word) < len(words),其中len(words)是拆分后单词列表的总元素个数,和「对比当前最短单词长度」的判断目标完全无关。以给出的测试用例为例,split后列表共8个元素,所有长度小于8的单词都会触发赋值,遍历过程中会依次把min_word赋值为"I"、"LOVE"、"python"、"version"、"three"、"and"、"point"、"10",最终输出最后一次赋值的"10",和预期结果不符。 - 分隔规则不符合需求:直接用
str.split()仅能按空格拆分,无法将标点识别为分隔边界,如果句子中存在hello,world、test.这类夹带标点的内容,会把标点计入单词长度,不符合「单词不含空格、标点」的定义。 - 初始值逻辑存在隐患:
min_word初始设为None,如果所有单词长度都不满足判断条件,最终会直接输出None,触发逻辑异常。 - 未实现同长度最短词的匹配规则:没有针对「多个同长度最短词取最后出现项」的要求做逻辑适配。
正确实现代码
实现逻辑:
- 用正则匹配所有连续的字母、数字序列作为合法单词,自动跳过空格、标点类分隔边界,避免手动枚举处理所有标点符号的冗余代码
- 正序遍历单词列表,维护当前记录的最短单词长度和结果值,只要当前单词长度小于等于当前记录的最短长度就更新结果——正序遍历场景下,后出现的同长度最短词会自动覆盖之前的记录,天然满足「取最后出现的最短词」的要求
import re sentence = input("sentence: ") # 提取所有连续的字母、数字序列作为合法单词,自动过滤空格、标点分隔符 words = re.findall(r"[a-zA-Z0-9]+", sentence) min_length = float('inf') result = "" for word in words: current_len = len(word) if current_len <= min_length: min_length = current_len result = word print(result)
针对给出的测试用例输入I LOVE python version three and point 10,代码运行后输出为I,和预期结果一致。如果输入包含标点的句子比如Hi! I am learning Python, it's fun,代码会自动拆分出['Hi','I','am','learning','Python','it','s','fun'],最终输出最短长度为1的最后出现项s,符合规则要求。
内容的提问来源于stack exchange,提问作者user19401771
相关产品推荐
相关产品推荐

