2016-03-10 5 views
0

Мне нужно ввести строку, удалить все пробелы и распечатать строку без гласных. Я также должен напечатать строку всех удаленных гласных.Не удается удалить две гласные в строке

Я очень близко к этой цели, но по какой-то причине, когда я пытаюсь удалить все гласные, он не удалит две гласные подряд. Почему это? Пожалуйста, дайте ответы на этот конкретный блок кода, так как решения помогли мне решить эту проблему, но не моей конкретной проблема

# 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("")) 

ответ

0

Ошибка

Таким образом, есть много других, и, возможно, лучше всего подходит для решения этой проблемы. Но, как вы упомянули, я просто обсуждаю ваши неудачи или то, что вы можете сделать лучше.

1. Составьте список входного слова

Есть много редеет вы могли бы сделать лучше

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

Вы не заменяет все пробелы причиной " " -> " " так просто использовать это вместо

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

2. Заменить цикл с в то время цикла

Потому что, если вы удалите элемент списка, for l in no_v: перейдет в следующую позицию. Но из-за удаления вам нужно то же положение, чтобы удалить все гласные в no_v и поместить их в v.

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

3. Верните значения

Потому что это функция не распечатываются значения просто вернуть их. В этом случае замените print no_vprint v и просто верните и распечатайте их.

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

4. Не ошибка, но быть готовым к питону 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') 
0

Вы изменяющее no_v пока перебор через него. Было бы намного проще сделать два новых списка: одно с гласными и одно без.

Другого варианта заключается в преобразовании его в время цикла:

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

Таким образом, у вас есть только одну переменного отслеживания своего места в no_v вместо двух у вас в настоящее время.

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:.
  • Узнайте о перечнях.
  • (Бонусные баллы :) Читайте о функции filter.
Смежные вопросы