def anti_vowel(text):
upper_vowels = ['A', 'E', 'I', 'O', 'U']
lower_vowels = ['a', 'e', 'i', 'o', 'u']
char_list = list(text)
for char in char_list:
if char in upper_vowels or char in lower_vowels:
char_list.remove(char)
new_word = ''
for char in char_list:
new_word += char
return new_word
如果我通过anti_vowel("Hey look Words!")
,我会得到结果'Hy lk Words!'
。 'o'
中的'Words!'
未被删除。
答案 0 :(得分:3)
正如其他人所说,你在迭代它时修改列表。这不会起作用:列表会在您迭代时改变大小,导致您跳过某些字符。您可以使用列表副本来避免这种情况,但也许可以考虑使用更好的方法。
您可以逐个字符地构建字符串,而不是:
def anti_vowel(text):
vowels = 'AEIOUaeiou'
result = []
for c in text:
if c not in vowels:
result.append(c)
return ''.join(result)
这比原始方法更快,更安全,更短,更容易阅读。
或者,您可以使用Python强大的内置字符串函数来完成此操作:
def anti_vowel(text):
return text.translate(dict.fromkeys(map(ord, 'aeiouAEIOU')))
这会将文本推送到删除所有元音的转换表中。简单!
答案 1 :(得分:0)
这里发生的事情很少。
list[:]
创建一个简单的副本。稍微简化代码:
def anti_vowel(text):
upper_vowels = ['A', 'E', 'I', 'O', 'U']
lower_vowels = [s.lower() for s in upper_vowels]
char_list = list(text)
for char in char_list[:]:
if char in upper_vowels or char in lower_vowels:
char_list.remove(char)
return ''.join(char_list)
如果要简化单个lambda下的所有内容,请使用以下命令:
anti_vowel = lambda text: ''.join([s for s in text if s.upper() not in ['A', 'E', 'I', 'O', 'U']])
您可以像常规函数anti_vowel()
一样调用它。其背后的想法如下:
[x for x in list]
)''.join([]
)