почему remove не удаляет последний элемент?
Условие: У вас есть текст и список слов. Вам необходимо проверить, отображаются ли слова в списке в том же порядке, что и в данном тексте.
Случаи, которые вы должны ожидать при решении этой задачи:
слово из списка отсутствует в тексте - ваша функция должна возвращать False; любое слово может встречаться в тексте более одного раза - используйте только первое; два слова одинаковы - ваша функция должна возвращать False; условие чувствительно к регистру, что означает «привет» и «привет» - два разных слова. текст включает только английские буквы и пробелы
def words_order(text: str, words: list) -> bool:
# your code here
text = text.split(' ')
for t in text:
if t not in words:
text.remove(t)
elif text.count(t)>1:
text.remove(t)
if text == words:
return True
else:
return False
assert words_order('hi world im here', ['world']) == True
Если распечатать text и words то в списке text по какой-то причине появляется here хотя должно остаться только слово world и результат должен быть true , в чем может быть ошибка?
Ответы (2 шт):
Таким способом все получилось, но все же если кто-нибудь знает , почему не работало предыдущее решение , подскажите пожалуйста .
def words_order(text: str, words: list) -> bool:
# your code here
text = text.split(' ')
# for t in text:
# print(t)
new_text = []
while text:
word = text.pop()
if word in words:
new_text.append(word)
elif text.count(word)>1:
text.remove(word)
new_text = new_text[::-1]
if new_text == words:
return True
else:
return False
Потому что нельзя удалять элементы из списка, по которому идёт итерация. Вот почему. Как только вы удалили один элемент, то все, которые после него, смещаются ближе к началу и следующий элемент после удаленного пропускается, и чем дальше, тем более неожиданные последствия.
Решение: создать новый список (как у вас в ответе) или идти по списку с конца:
for t in text[::-1]: