无法连续删除两个元音

时间:2016-03-10 05:21:21

标签: python

我必须输入一个字符串,删除所有空格并打印不带元音的字符串。我还必须打印一串所有删除的元音。

我已经非常接近这个目标,但出于某种原因,当我尝试删除所有元音时,它不会连续删除两个元音。为什么是这样?请为这个特定的代码块提供答案,因为解决方案帮助我解决了挑战,但不是我的具体问题

# first define our function
def disemvowel(words):
    # separate the sentence into separate letters in a list
    no_v = list(words.lower().replace(" ", ""))
    print no_v
    # create an empty list for all vowels
    v = []
    # assign the number 0 to a
    a = 0

    for l in no_v:
        # if a letter in the list is a vowel:
        if l == "a" or l == "e" or l == "i" or l == "o" or l == "u":
            # add it to the vowel list
            v.append(l)
            #print v
            # delete it from the original list with a
            del no_v[a]
            print no_v
        # increment a by 1, in order to keep a's position in the list moving
        else:
            a += 1

    # print both lists with all spaces removed, joined together
    print "".join(no_v)
    print "".join(v)

disemvowel(raw_input(""))

3 个答案:

答案 0 :(得分:0)

您在迭代时修改no_v。制作两个新列表更简单,一个是元音,另一个是没有。

另一种选择是将其转换为while循环:

while a < len(no_v):
    l = no_v[a]

通过这种方式,您只需使用一个变量跟踪no_v中的位置,而不是当前的两个变量。

答案 1 :(得分:0)

出于教育目的,这一切都可以显着减少麻烦。

def devowel(input_str, vowels="aeiou"):
  filtered_chars = [char for char in input_str 
                    if char.lower() not in vowels and not char.isspace()]
  return ''.join(filtered_chars)

assert devowel('big BOOM') == 'bgBM'

为了帮助您学习,请执行以下操作:

  • 定义一个函数,如果必须删除特定字符,则返回True
  • 使用该功能,循环输入字符串中的字符,只留下符合条件的字符。
  • 在上文中,请避免使用索引和len(),而是迭代字符,如for char in input_str:
  • 了解列表推导。
  • (Bonus points :)了解filter功能。

答案 2 :(得分:0)

的错误

所以还有很多其他的,也许更好的方法来解决这个问题。但正如你所提到的,我只讨论你的失败或你可以做得更好。

<强> 1。列出输入词

有很多你可以做得更好的

no_v = list(words.lower().replace(" ", ""))

您不能替换" " -> " "的所有空间,因此请改用

no_v = list(words.lower().translate( None, string.whitespace))

<强> 2。用while循环替换for循环

因为如果删除列表中的元素,for l in no_v:将转到下一个位置。但是由于删除你需要相同的位置,删除no_v中的所有元音并将它们放在v中。

    while a < len(no_v):
      l = no_v[a]

第3。返回值

因为它的功能是不打印值只是返回它们。在这种情况下,请替换print no_v print v,然后返回并打印它们。

return (no_v,v) # returning both lists as tuple

<强> 4。这不是错误,而是为python 3.x

做好准备

尝试始终使用print("Have a nice day")代替print "Have a nice day"

您的算法没有错误

您的算法现在看起来像这样

import string
def disemvowel(words):
    no_v = list(words.lower().translate( None, string.whitespace))
    v = []
    a = 0
    while a < len(no_v):
        l = no_v[a]
        if l == "a" or l == "e" or l == "i" or l == "o" or l == "u":
            v.append(l)
            del no_v[a]
        else:
            a += 1
    return ("".join(no_v),"".join(v))

print(disemvowel("Stackoverflow is cool  !"))

<强>输出

对于句子Stackoverflow is cool !\n,它输出

('stckvrflwscl!', 'aoeoioo')

我将如何在python中执行此操作

没问,但我给你一个我可能会用的解决方案。因为它与字符串替换有关,或匹配我只会使用正则表达式。

def myDisemvowel(words):
    words = words.lower().translate( None, string.whitespace)
    nv = re.sub("[aeiou]*","", words)
    v = re.sub("[^a^e^i^o^u]*","", words)
    return (nv, v)

print(myDisemvowel("Stackoverflow is cool  !\n"))

我只使用正则表达式,对于nv字符串,我只用空字符串替换所有voewls。对于元音字符串,我只需用空字符串替换所有非元音的组。如果你写这个压缩,你可以用2行代码解决这个问题(只需返回替换)

<强>输出

对于句子Stackoverflow is cool !\n,它输出

('stckvrflwscl!', 'aoeoioo')