Python函数vowelList求助:重复元音无法仅保留单个实例
问题:Python函数vowelList无法对重复元音去重
我编写Python函数vowelList时遇到问题:当输入字符串包含重复元音时,函数无法仅返回该元音的一个实例。任务要求如下:
- 函数接收单个字符串参数
- 返回字符串中所有元音的列表,每个元音仅出现一次,且不区分大小写
- 示例:调用
vowelList("mississippi")应返回['I'],因为输入中唯一的元音是'i'
用输入"book"测试时,我期望的输出是:
['O']
但实际得到的输出是:
['O', 'O']
我的代码如下:
def vowelList(s): low = s.lower() L = [] vowels = "aeiou" for char in low: if char not in L and char in vowels: L.append(char.upper()) return L print(vowelList("book"))
问题原因
核心问题在判断条件char not in L:你把小写的char和列表L中已经转成大写的元素做对比。比如处理"book"时:
- 第一个'o'转小写后是
'o',此时L为空,'o' not in []成立,添加'O'到L - 第二个'o'转小写后还是
'o',此时判断'o' not in ['O']——因为小写'o'和大写'O'是不同字符,条件依然成立,所以又添加了一次'O'
修正方案
方案1:判断时用大写字符检查列表
def vowelList(s): low = s.lower() L = [] vowels = "aeiou" for char in low: upper_char = char.upper() if upper_char not in L and char in vowels: L.append(upper_char) return L print(vowelList("book")) # 输出 ['O']
方案2:用集合记录已出现的小写元音(更高效)
集合的查找效率比列表更高,适合去重场景:
def vowelList(s): low = s.lower() seen = set() result = [] vowels = "aeiou" for char in low: if char in vowels and char not in seen: seen.add(char) result.append(char.upper()) return result print(vowelList("book")) # 输出 ['O']
方案3:用集合交集快速去重(简洁写法)
如果不需要保持元音第一次出现的顺序,可以用集合交集直接获取唯一元音:
def vowelList(s): low = s.lower() unique_vowels = set("aeiou") & set(low) return [v.upper() for v in sorted(unique_vowels)] print(vowelList("book")) # 输出 ['O']
内容的提问来源于stack exchange,提问作者RykerStrike
相关产品推荐
相关产品推荐

