从字符串python中删除元音

时间:2018-03-18 08:23:03

标签: python python-3.x

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

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'。

2 个答案:

答案 0 :(得分:5)

迭代时,不要在列表上调用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))

......但基本想法是一样的。

答案 1 :(得分:-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