【问题标题】:Deleting using Enumerate function skipping character使用 Enumerate 函数跳过字符删除
【发布时间】:2015-03-28 02:01:12
【问题描述】:

我在删除时阅读了几篇关于这个跳过字符的帖子,但没有找到解决方案

我正在尝试在 python 2.7 中制作反元音程序,但卡在多个点上。!!

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

请帮忙改正。

代码:

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

但需要使用删除功能的解决方案

提前谢谢!!

【问题讨论】:

    标签: python python-2.7 for-loop enumerate


    【解决方案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)
    

    【讨论】:

      猜你喜欢
      • 2012-01-24
      • 1970-01-01
      • 2013-09-30
      • 1970-01-01
      • 2016-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多