0

Задача: пользователь вводит текст из букв и символов, нужно вывести список состоящий из слов без лишних символов.

text = str(input('Введите текст:\t'))
list_text = text.split(' ')
for i in list_text:
    for j in i:
        if not j.isalpha():
            i = i.replace(j, '')
print(list_text) 

Не могу понять почему в этом коде не работает цикл замены символов на ""? символы просто остаются на своих местах вместо замены. При том что цикл начиная с for j in i отдельно от основного кода работает без вопросов.

Alex
  • 1

2 Answers2

0

так как вы не сохраняете измененный символ в список

text = str(input('Введите текст:\t'))
list_text = text.split(' ')
for i in range(len(list_text)):
    for j in list_text[i]:
        if not j.isalpha():
            list_text[i] = list_text[i].replace(j, '')
print(list_text) 

код не проверял, но должен работать

turkindv
  • 487
  • нет, не будет работать, так как у вас после замены j на пустую строку, получается что следующий j в цикле будет не следующим, а следующим следующим, это очень распространенная ошибка, в итоге будет IndexError. Чтобы прошло без ошибок, вам надо все изменения сохранять в новый массив строк, а старый не изменять, НИКАК. – zolars Jan 30 '22 at 14:47
  • Спасибо. Как ни странно, но у меня этот код работает без ошибок – Alex Jan 30 '22 at 14:56
  • Боюсь что нет, можно провести эксперимент https://pastebin.com/5E1eAHaX это будет бесконечный цикл. IndexError был бы справедлив есть использовать цикл вида for i in range(len(lst)):

    можно попробовать разобраться получше запустив python3 -m dis main.py

    – turkindv Jan 30 '22 at 15:46
0

Строка не изменяется, так как вы в цикле присваиваете к i строку, во втором цикле вы присваиваете к j символ из этой строки, поэтому, когда вы изменяете символ i = i.replace(j, ''), вы изменяете не исходную строку, вы изменяете новую строку j, которую вы создали в цикле. Для изменения исходной строки вам надо перебирать не элементы строки, а индексы.

alphabet = “abcdefghijklmnopqrstuvwxyz”
text = input('Введите текст:\t')
list_text = text.split()
new_list_text = [""]*len(list_text)

for i in range(len(list_text)): for j in range(len(list_text[i])): if not list_text[i][j].lower() in alphabet: new_list_text[i] = list_text[i][:j] + list_text[i][j+1:]

    else:
        new_list_text[i] = list_text[i]

print(new_list_text)

zolars
  • 702
  • Спасибо, упустил момент что изменяю переменную, а не содержание индекса – Alex Jan 30 '22 at 14:55
  • ничего, со всеми бывает) – zolars Jan 30 '22 at 14:56
  • Что-то не так, код не работает, не происходит удаления символов, вернее удаляется только последний символ каждой строки из коллекции если он не буква – Alex Jan 30 '22 at 15:27