@sasha300

Как удалить из строки все слова, начинающиеся на букву «м»?

Всем привет!
Уже 2 дня не могу победить задание:
# Задана строка из стихотворения:
# Удалите из строки все слова, начинающиеся на букву «м».
# Результат вывести на экран в виде строки.
# Подсказка: вспомните про модификацию списков.

a = "Мой дядя самых честных правил, Когда не в шутку занемог, \
    Он уважать себя заставил И лучше выдумать не мог"
a = a.split()
for i in range(len(a)): # 0,19
    if a[i][0] == "М" or a[i][0] == "м":
        del a[i]

На что выдает:
IndexError: list index out of range


Можно так:
a = "Мой дядя самых честных правил, Когда не в шутку занемог, \
    Он уважать себя заставил И лучше выдумать не мог"
a = a.split()
for i in range(len(a) - 1): # 0,19
    if a[i][0] == "М" or a[i][0] == "м":
        del a[i]

И код успешно уберет первое слово, но где гарантия, что в другом списке не будет пару слов, начинающиеся на букву "м"? Тогда надо ставить range(len(a) - 2) и т.д. Мой скрипт имеет в этом изъян.
Короче вижу, что зашел в тупик, im need help!
  • Вопрос задан
  • 6613 просмотров
Решения вопроса 1
@deliro
Регуляркой:

import re
p = re.compile(r"\bм.*?\b", re.I)  # \b — это граница слова, есичё
re.sub(p, "" , s)


Списками:

" ".join([x for x in s.split() if not x.startswith(("м", "М"))])


Правильно:
" ".join(x for x in s.split() if not x.startswith(("м", "М")))
Ответ написан
Пригласить эксперта
Ответы на вопрос 2
@Eugen_p
А почему вы не хотите создать новый список?
a = "Мой дядя самых честных правил, Когда не в шутку занемог, \
    Он уважать себя заставил И лучше выдумать не мог"
res = [i for i in a.lower().split() if not i.startswith('м')]


Если нужно именно удалять то:
a = "Мой дядя самых честных правил, Когда не в шутку занемог, \
    Он уважать себя заставил И лучше выдумать не мог"
a = a.lower().split()
i = 0
while i < len(a):
  if a[i].startswith('м'):
    del a[i]
    continue
  i += 1
Ответ написан
Комментировать
netpastor
@netpastor
Python developer
result = ' '.join(filter(lambda w: w[0] not in ["М", "м"], a.split()))
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы