Ошибка при удалениеи элементов в цикле for ... in
Надо создать функцию, где на входе будет список предложений, а на выходе из предложений удаляются все слова, содержащие цифры, специальные знаки, т.е. не буквы.
Например:
input: ['1 thousand devils', 'My name is 9Pasha', 'Room #125 costs $100']
output: ['thousand devils', 'My name is', 'Room costs']
Написал следующий код:
def process(sentences):
result = []
a = 0
for item in sentences:
item = item.split(' ') #Каждое предложение разбивается на отдельный список
for word in item:
a += 1
print(a) #Добавил счетчик, чтобы легче понять на каком слове происходит ошибка
for letter in word:
if str.isalpha(letter) == False:
item.remove(word) #В одной из итераций здесь происходит ошибка
item = ' '.join(item) #Предложения соединяются обратно в строку
result.append(item)
return result
A = ['1 thousand devils', 'My name is 9Pasha', 'Room #125 costs $100']
B = process(A)
print(B)
По моим расчетам, из предложения (item) должно удалиться слово (word), в котором очередная итерация нашла недопустимый символ, но выводится ошибка:
1
2
3
4
5
6
7
8
Traceback (most recent call last):
File "test.py", line 17, in <module>
B = process(A)
File "test.py", line 11, in process
item.remove(word)
ValueError: list.remove(x): x not in list
PS Буду рад и другим способ решения задачи, но мне крайне интересно понять саму суть ошибки, откуда вообще Python взял переменную x.
Python 3.7.5
Ответы (2 шт):
Альтернативное решение с использованием list comprehension:
res = [" ".join(word for word in sent.split() if word.isalpha())
for sent in sentences]
результат:
In [45]: res
Out[45]: ['thousand devils', 'My name is', 'Room costs']
PS метод str.isalpha() - позволяет проверять целую строку, соотвественно нет необходимости проверять каждую букву в слове.
Легче всего понять причину ошибки добавив отладочную информацию:
я добавил строку print(f"removing word: [{word}] from [{item}]") в ваш код:
def process(sentences):
result = []
a = 0
for item in sentences:
item = item.split(' ') #Каждое предложение разбивается на отдельный список
for word in item:
a += 1
print(a) #Добавил счетчик, чтобы легче понять на каком слове происходит ошибка
for letter in word:
if str.isalpha(letter) == False:
print(f"removing word: [{word}] from [{item}]")
item.remove(word) #В одной из итераций здесь происходит ошибка
item = ' '.join(item) #Предложения соединяются обратно в строку
result.append(item)
return result
вывод:
In [58]: process(sentences)
1
removing word: [1] from [['1', 'thousand', 'devils']]
2
3
4
5
6
removing word: [9Pasha] from [['My', 'name', 'is', '9Pasha']]
7
8
removing word: [#125] from [['Room', '#125', 'costs', '$100']]
removing word: [#125] from [['Room', 'costs', '$100']]
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
<ipython-input-58-c110f32279b9> in <module>
----> 1 process(sentences)
<ipython-input-57-23b8232cb157> in process(sentences)
10 if str.isalpha(letter) == False:
11 print(f"removing word: [{word}] from [{item}]")
---> 12 item.remove(word) #В одной из итераций здесь происходит ошибка
13 item = ' '.join(item) #Предложения соединяются обратно в строку
14 result.append(item)
ValueError: list.remove(x): x not in list
Мне кажется следующие строки наглядно объясняют причину возникновения ошибки:
removing word: [#125] from [['Room', '#125', 'costs', '$100']]
removing word: [#125] from [['Room', 'costs', '$100']]