2014-02-03 7 views
-5

Я написал функцию для удаления гласных в заданной строке.Удаление букв из строки в Python

def anti_vowel(text): 
    text = list(text) 
    vowel = 'aeiou' 
    for letter in text: 
     if letter.lower() in vowel: 
      text.remove(letter) 
    return ''.join(text) 

Он не удаляет все гласные, когда я ввожу «Привет, слова!» выход «Hy lk Words!»

Почему этот код не удаляет все гласные на входе?

+1

См [это] (HTTP: // arshajii .com/кодирования-FAQs/конц-лист-mod.html). – arshajii

+8

Серьезно, вы отправляете идентичный код из вопроса с 50 upvotes, который имеет тот же результат ..... Как вы можете это пропустить. Вы даже назвали функцию той же. Что за черт, lol. – luk32

ответ

2

Изменение числа list, которое вы зацикливаете, может привести к нежелательным результатам. Сделайте копию первого:

for letter in text[:]: 

Использование [:] называется список нарезка. От Python Docs:

Все операции среза возвращают новый список, содержащий запрошенные элементы. Это означает, что следующий фрагмент возвращает неполную копию списка a
>>> a[:]

The также и другие способы, чтобы сделать копию, как:

list(text) 

Подробнее aboout how to make a copy of a list.

0

Вот решение:

def anti_vowel(text): 
    text = list(text) 
    result = list() 
    for letter in text: 
     if letter.lower() not in 'aeiou': 
      result.append(letter) 
    return ''.join(result) 

s = 'Hey look Words!' 
print anti_vowel(s) 

Выход:

Hy lk Wrds! 
+0

На самом деле это не отвечает на вопрос. Вопрос в том, почему, и есть хороший ответ на его исходную копию =) – luk32

+0

ой, есть другой вопрос :) –

2

Вы модифицируя список во время итерации. Одним из решений является перебрать копию списка. Другое решение, чтобы избежать побочных эффектов и идти функциональны:

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

Вы можете использовать шаблон регулярного выражения, которое исключает все гласные с шляпой^

import re 
pattern = '([^aeiou])' 
str_ = "no vowels" 
no_vowel_list = re.findall(pattern,str_) 
print no_vowel_list 
Смежные вопросы