【问题标题】:pop() function not functioning right in a for looppop() 函数在 for 循环中无法正常工作
【发布时间】:2016-04-01 02:18:15
【问题描述】:

代码如下:

vowels = ['a','e','i','o','u']

def anti_vowel(text):
    tlength = len(text)
    words = []
    result = ""
    for word in range(len(text)):
        words.append(text[word])
        print words
    for index, word in enumerate(words):
        if word.lower() in vowels:
            words.pop(index)
    for old_word in words:
        result += str(old_word)
    return result

print anti_vowel("Hey look words!")

预期结果:“Hy lk wrds!” 明显结果:“Hy lok words!”

我无法弄清楚为什么循环会跳过列表单词中索引 5 上的“o”。我知道我可以通过将非元音单词附加到列表并将它们组合来做到这一点,但我想知道如何获得上述代码所需的结果。

【问题讨论】:

  • 我的输出是-> Hy lok wrds!
  • 您正在修改words,同时对其进行迭代。
  • 在使用str转换之前old_word是什么类型?
  • 如果vowels都是小写的,为什么要和大写比较?
  • @PeterWood 我应该在调用函数的语句中添加一个 raw_input() 而不是硬编码。

标签: python for-loop


【解决方案1】:

您正在删除字符,但您的 index 正在指望。所以元音不再在索引中了,正如你所料。

最好不要在 for 循环中更改列表,而是创建一个新列表:

def anti_vowel(text):
    words = []
    for character in text:
        if not (character.lower() in vowels or character.upper() in vowels):
            words.append(character)
    return ''.join(words)

或使用生成器表达式:

def anti_vowel(text):
    return ''.join(c for c in text if c.lower() not in vowels)

当你想删除单个元素时,你必须使用一个while循环:

def anti_vowel(text):
    text = list(text)
    index = 0
    while index < len(text):
        if text[index].lower() in vowels:
            del text[index]
        else:
            index += 1
    return ''.join(text)

【讨论】:

  • 完美而简单:)
  • 生成器的效率低于str.join 中的列表推导。见When is not a good time to use python generators?
  • 谢谢你的回答丹尼尔,是的,我已经提到我知道那样。所以基本上你的意思是,当我从列表中删除/弹出内容时,索引会继续,弹出过程就像一个缓慢的过程,并且无法在前一个旁边的“o”处同步索引?有没有办法纠正这个? (我不擅长解释东西……请原谅)
  • 那么,如果您知道正确而优雅的解决方案,为什么还要采用复杂且容易出错的方式呢?
  • @Daniel 效率较低,因为必须创建生成器。有关相关问题,请参阅 this answer
猜你喜欢
  • 1970-01-01
  • 2013-10-09
  • 2017-11-11
  • 1970-01-01
  • 1970-01-01
  • 2013-06-26
  • 2020-10-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多