我在删除但是没有找到解决方案的情况下阅读了这个跳过字符的几个帖子
我正在尝试在python 2.7中制作反元音节目,但却停留在多个点上。!!
请帮助纠正错误。
代码:
import copy
vowels=['a','e','i','o','u'] # Making list of vowels
#Function for anti_vowel
def anti_vowel(text):
new_list=list(text) # Converting it into list
new_list_copy=copy.deepcopy(new_list) # Copying the list to iterate
res="" # For converting back to string
for index, j in enumerate(new_list_copy):
m = j.lower() # Converting it into a lower-case for comparison
if m in vowels:
del(new_list[index]) # Deleting if a vowel is in list(HERE IS THE PROBLEM)
return res.join(new_list)
print anti_vowel("HeEY lOok Word!")
P.S:我通过在新列表中添加替换DELETE函数来实现它:
if j.lower() not in vowels:
x.append(j) #x is a new list
但需要具有删除功能的解决方案
提前谢谢!!
答案 0 :(得分:1)
当前代码不起作用的原因与在迭代时修改列表不起作用的原因相同(即使您没有这样做,确切地说):后面项目的索引删除之前的项目时会更改列表。
避免此问题的一种可能方法是反向迭代列表并从原始长度中减去索引以后的项目。由于您删除的第一个项目将位于列表的末尾,因此以后的项目将不会更改其索引:
new_list = list(text)
L = len(new_list)
for i, j in enumerate(reversed(new_list)):
if j.lower() in vowels:
del new_list[L - i - 1]
请注意,使用负索引(而不是手动减去原始长度)将不起作用,因为当您从末尾删除项目时,列表的长度会发生变化。
我意识到这不是你当前任务所需要的,而是最多的" Pythonic"解决问题的方法是将一个生成器表达式放在str.join
调用中,而不是根本不使用任何列表:
def anti_vowel(text):
return "".join(c for c in text if c.lower() not in vowels)