如何修复短信缩写代码以保留全元音单词?
短信缩写编码程序修复方案
需求规则
- 保留空格,每个单词单独编码,单词指连续字母字符串
- 纯元音组成的单词,完全保留原内容
- 包含至少一个辅音的单词,仅保留前一个字符不是辅音的辅音,所有元音都移除
- 元音定义:
a、e、i、o、u,其余字母为辅音
现有代码问题
当前代码无法正确处理纯元音单词,比如输入"aeiou bcdfghjklmnpqrstvwxyz",预期输出是"aeiou b",但现有代码会错误移除纯元音单词的所有字符。核心问题在于:
- 辅助函数逻辑混乱:
Vowel函数错误地将单个字符和整个元音字符串比较,永远返回0isVowel返回的是元音数量,而非判断单词是否全为元音noVowel函数遍历字符时却判断整个参数是否不在元音中,逻辑完全错误
transform函数未先判断单词是否为纯元音,直接进入编码逻辑,导致纯元音单词被错误处理
修正后的实现方案
核心优化点
- 简化元音判断逻辑,用集合提升效率
- 新增全元音单词判断逻辑,优先处理这类单词
- 重构辅音编码逻辑,严格遵循“仅保留前一个字符不是辅音的辅音”规则
完整代码
# 定义元音集合,提升判断效率 VOWELS = {'a', 'e', 'i', 'o', 'u'} def is_vowel(ch): """判断单个字符是否为元音""" return ch.lower() in VOWELS # 可选:支持大写字母,若不需要可去掉lower() def is_all_vowels(word): """判断单词是否由纯元音组成""" for ch in word: if not is_vowel(ch): return False return True def transform(word): # 先判断是否是纯元音单词,是则直接返回原词 if is_all_vowels(word): return word # 处理包含辅音的单词:仅保留前一个字符不是辅音的辅音 result = [] prev_is_consonant = False # 标记前一个字符是否为辅音 for ch in word: if is_vowel(ch): # 元音直接跳过 prev_is_consonant = False continue # 当前是辅音,判断前一个是否不是辅音 if not prev_is_consonant: result.append(ch) prev_is_consonant = True return ''.join(result) def getMessage(original): # 拆分单词,逐个转换后用空格拼接,比循环累加更高效 transformed_words = [transform(word) for word in original.split()] return ' '.join(transformed_words) if __name__ == '__main__': print(getMessage("aeiou bcdfghjklmnpqrstvwxyz")) # 输出:aeiou b print(getMessage("hello world")) # 测试:h w print(getMessage("aeiou AEIOU")) # 输出:aeiou AEIOU(若去掉lower()则AEIOU会被处理成A)
代码说明
is_vowel:简单判断单个字符是否为元音,可选支持大写字母is_all_vowels:遍历单词所有字符,只要有一个非元音就返回False,确保纯元音单词被正确识别transform:先判断纯元音情况,直接返回原词;对于含辅音的单词,用prev_is_consonant标记前一个字符类型,只保留首次出现的连续辅音的第一个字符getMessage:用列表推导式和join替代循环累加,代码更简洁高效
内容的提问来源于stack exchange,提问作者Serendipity778
相关产品推荐
相关产品推荐

