Удаление с помощью символа пропуска функции Enumerate

Я прочитал несколько сообщений об этом пропуске символа при удалении, но не нашел решения

Я пытаюсь создать программу против гласных в python 2.7, но застрял в нескольких точках.!!

  1. Как и в моей программе, я сделал копию списка, чтобы перебрать его, чтобы я мог удалить гласные из исходного списка, если они найдены в глобально определенном списке гласных, но он пропускает символы!! (Возможно, из-за увеличенного индекса)
  2. При работе с нижней функцией моя программа иногда выдает ошибку индекса присваивания списка вне диапазона!!. Это что-то связанное с распределением памяти или что-то еще. (Потому что, когда я удалил его, программа работала хорошо !!)

Пожалуйста, помогите сделать это правильно.

Код:

import copy
vowels=['a','e','i','o','u'] # Making list of vowels
#Function for anti_vowel
def anti_vowel(text):
    new_list=list(text) # Converting it into list
    new_list_copy=copy.deepcopy(new_list) # Copying the list to iterate
    res="" # For converting back to string

    for index, j in enumerate(new_list_copy):
        m = j.lower() # Converting it into a lower-case for comparison
        if m in vowels:
            del(new_list[index]) # Deleting if a vowel is in list(HERE IS THE PROBLEM)
    return res.join(new_list)
print anti_vowel("HeEY lOok Word!")

P.S: я заставил это работать, заменив функцию DELETE добавлением в новый список:

if j.lower() not in vowels:
            x.append(j) #x is a new list

НО ТРЕБУЕТСЯ РЕШЕНИЕ С ФУНКЦИЕЙ УДАЛЕНИЯ

Заранее спасибо!!


person Ankit Gupta    schedule 28.01.2015    source источник


Ответы (1)


Причина, по которой ваш текущий код не работает, такая же, как и причина, по которой изменение списка во время итерации по нему не работает (даже если вы этого не делаете): индексы более поздних элементов в списке изменяются, когда более ранние элементы удаляются.

Возможный способ избежать этой проблемы — выполнить итерацию по списку в обратном порядке и вычесть исходную длину для индексации последующих элементов. Поскольку первые элементы, которые вы удаляете, будут в конце списка, индексы последующих элементов не изменятся:

new_list = list(text)
L = len(new_list)
for i, j in enumerate(reversed(new_list)):
    if j.lower() in vowels:
        del new_list[L - i - 1]

Обратите внимание, что использование отрицательной индексации (вместо ручного вычитания из исходной длины) не сработает, так как длина списка будет меняться по мере удаления элементов с конца.

Я понимаю, что это не то, что вам нужно для вашего текущего задания, но самый "питоновский" способ решить вашу проблему - поместить выражение генератора внутри вызова str.join и вообще не использовать никаких списков:

def anti_vowel(text):
    return "".join(c for c in text if c.lower() not in vowels)
person Blckknght    schedule 29.01.2015