使用枚举函数跳过字符删除

时间:2015-01-28 23:52:22

标签: python python-2.7 for-loop enumerate

我在删除但是没有找到解决方案的情况下阅读了这个跳过字符的几个帖子

我正在尝试在python 2.7中制作反元音节目,但却停留在多个点上。!!

  1. 在我的程序中,我制作了一个列表的副本来迭代它,这样我就可以从原始列表中删除元音,如果在全局定义的元音列表中找到但是它正在跳过字符!! (可能是因为增加了索引)
  2. 使用较低功能时,我的程序有时会给列表分配索引超出范围错误!!这是与内存分配或其他内容有关的事情。 (因为,当我删除它时,程序运行良好!!)
  3. 请帮助纠正错误。

    代码:

    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
    

    但需要具有删除功能的解决方案

    提前谢谢!!

1 个答案:

答案 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)