Python 3.6:elif语句导致单词交换函数异常问题求助
解决单词交换函数的提示重复与结果异常问题
我来帮你修复这个函数的问题,先分析下原代码的核心问题,再给出完整的解决方案:
原代码的问题根源
你把「检查单词是否存在」的逻辑放在了re.sub的回调函数里,这个回调函数会每匹配到一个单词就执行一次。这就导致两个问题:
- 只要有一个单词不匹配,就会重复打印提示信息(匹配多少次就打印多少次);
return print(...)会返回None,最终替换后的字符串里会混入大量None,导致结果完全异常。
正确的做法应该是先全局检查一次单词是否存在,再决定是输出提示还是执行交换操作。
修复后的完整代码
import re def swapfunc(a, b, c): # 提取字符串中所有单词的小写集合,用于快速判断存在性(忽略大小写) all_words = {word.lower() for word in re.findall(r'\w+', a)} missing_words = [] # 检查目标单词是否存在 if b.lower() not in all_words: missing_words.append(b) if c.lower() not in all_words: missing_words.append(c) # 处理单词缺失的情况 if missing_words: # 构造提示信息,多个缺失单词时每行输出一个提示 return '\n'.join([f'Not in string: "{word}"' for word in missing_words]) # 单词都存在时,执行交换逻辑 def replace_match(match): current_word = match.group(1).lower() if current_word == c.lower(): return b.upper() elif current_word == b.lower(): return c.upper() else: return match.group(1) return re.sub(r'(\w+)', replace_match, a) # 测试用例验证 print(swapfunc("Dylan and Bob work together.", "dylan", "bob")) # 输出:BOB and DYLAN work together. print(swapfunc("Dylan and Bob work together.", "BOB", "DylAn")) # 输出:DYLAN and BOB work together. print(swapfunc("and Bob work together.", "dylan", "bob")) # 输出:Not in string: "dylan" print(swapfunc("Dylan and work together.", "DYLAN", "BoB")) # 输出:Not in string: "BoB"
关键优化点
- 全局存在性检查:提前提取所有单词的小写集合,只做一次检查,避免重复判断;
- 分离逻辑:把「缺失提示」和「单词交换」拆成两个独立分支,逻辑更清晰;
- 正确返回值:缺失时返回提示字符串,交换时返回处理后的文本,确保
print输出符合预期; - 大小写兼容:所有存在性判断和匹配都转成小写,支持任意大小写的参数输入(符合你的测试用例要求)。
额外场景支持
如果两个单词都缺失,函数会输出两行提示:
print(swapfunc("Alice works alone.", "dylan", "bob")) # 输出: # Not in string: "dylan" # Not in string: "bob"
内容的提问来源于stack exchange,提问作者Henry
相关产品推荐
相关产品推荐

