【问题标题】:Removing vowels from the string python [duplicate]从字符串python中删除元音[重复]
【发布时间】:2018-08-27 00:06:15
【问题描述】:

我期待下面的代码中没有元音字符串,但它并没有给我我所期待的。请帮忙。

def disemvowel(word):
    words = list(word)
    for i in words:
        if i.upper() == "A" or i.upper() == "E" or i.upper() == "I" or i.upper() == "O" or i.upper() == "U":
            words.remove(i)


    return print(''.join(words))

disemvowel("uURII")

我原以为输出是“R”,但我得到的是“URI”。

【问题讨论】:

  • 我不认为这是一个骗局。在那个问题上,他犯了与 OP 完全不同的错误。而且,假设他想了解自己在做什么,而不是扔掉他的代码和对别人的货物崇拜,那么这个问题及其答案对他没有帮助。
  • @abarnert 公平点。
  • @abarnert 我同意副本并没有像您那样解释这一切,但是还有其他副本解释了众所周知的行为。让我找一个。
  • @Jean-FrançoisFabre 第二个副本(关于如何从列表中删除项目)对 OP 以及其他任何有他问题的人来说绝对有用;如果它还没有自动关闭,我会投票关闭它。
  • 这是最近的事,我当时就关注了这个问题。你没有。人们被允许错过一些受骗者。只是不像某些人那样所有,就是这样:)

标签: python python-3.x


【解决方案1】:

在迭代列表时不要在列表上调用remove

想想当你这样做时会发生什么。

  • 首先,words = 'uURII'i 指向它的第一个字符。
  • 您拨打words.remove(i)。现在words = 'URII'i 指向它的第一个字符。
  • 下一次循环,words = 'URII'i 指向它的第二个字符。糟糕,您错过了U

有几种方法可以解决此问题 - 您可以遍历列表的副本,或者您可以从末尾而不是开头索引它,或者您可以在 while 循环中使用索引并确保不递增,直到找到不想删除的内容,等等。

但最简单的方法是建立一个新列表:

def disemvowel(word):
    words = list(word)
    new_letters = []
    for i in words:
        if i.upper() == "A" or i.upper() == "E" or i.upper() == "I" or i.upper() == "O" or i.upper() == "U":
            pass
        else:
            new_letters.append(i)
    print(''.join(new_letters))

这意味着您首先不再需要list(word);你可以遍历原始字符串。

您可以通过其他几种方式来简化这一点——使用集合成员检查而不是五个单独的== 检查,翻转比较,并将循环向上滚动到列表推导(或生成器表达式):

def disemvowel(word):
    vowels = set('AEIOU')
    new_letters = [letter for letter in word if letter.upper() not in vowels]
    print(''.join(new_letters))

……但基本思想是一样的。

【讨论】:

  • if letter.upper() not in set('AEIOU'):让我告诉你,它不是很有效,因为set('AEIOU') 是在每次迭代中构建的。这么多的速度增益。要么事先构建集合,要么使用{'A','E','I','O','U'},所以它是字面的。此外,当有 5 个字母时,使用 set 并没有多大帮助。
  • @Jean-FrançoisFabre 好点。无论如何,OP 可能更清楚地命名该集合。 (我更多地使用了一组,因为从概念上讲,我们正在检查它是否在一组字母中,而不是为了提高效率,但您的更改带来了两个好处。)
  • 已经好多了。在一个真正的程序中,我会把它设为全局的,所以它只构建一次(或使用文字形式)。但这只是吹毛求疵。
  • @Jean-FrançoisFabre 当然,如果您真的担心性能,那么 LOAD_GLOBAL 每次循环都会产生影响;您可能希望将其分配给本地(显式在函数顶部,或通过默认参数值)。但这并不重要。
  • @Jean-FrançoisFabre 我更关心人们的学习,而不是人们获得可以不假思索地使用的代码,而且我真的不在乎他们以后是否抱怨他们不假思索就无法使用它。此外,我从未见过有人抱怨代码太慢了 5%。通常当他们说“最有效的方法是什么”时,并不是因为他们需要进行微优化,而是因为他们无缘无故地使用了指数时间递归算法。
【解决方案2】:

这应该会有所帮助。

def disemvowel(word):
    words = list(word)
    v = ["a", "e", "i", "o", "u"]     #list of vowel 
    return "".join([i for i in words if i.lower() not in v])  #check if alphabet not in vowel list 
print disemvowel("uURII")

输出:

R

【讨论】:

  • 如果你只是给他新代码而不解释它的作用,或者他现有的代码有什么问题,至少让它简单和惯用。你为什么在这里做words = list(word)?为什么v 是一个列表而不是一个集合(或者可能是一个字符串)?同时,在这里使用lower 并没有错,但这会让OP 认为他在尝试中使用upper 的方式有问题,而实际上并没有。
猜你喜欢
  • 2014-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-07
  • 2018-11-23
  • 2021-05-23
相关资源
最近更新 更多