Словами будем считать последовательности букв, разделённых пробелами. Знаки препинания не являются частью слова.
ПРИМЕР: если мы ввели строку
Моя головная боль: математика, физика, информатика.
программа должна вывести:
Моя
боль
физика
головная
математика
информатика
1. Вводим строку:
s = input()
2. Чтобы разбить строку на элементы, используем метод .split(), причём без аргумента, потому что разбивать будем по пробелу.
wrds = s.split()
Переменная wrds теперь — это список строк. Каждая строка — слово, причём со знаком препинания в конце, если он там был. Например, «физика, „.
3. Давайте удалим последний символ каждой подстроки, если это знак препинания. Конечно, мы могли бы сделать это «в лоб»:
# для всех подстрок списка
for i in range(len(wrds)):
# если последний символ — знак препинания
if wrds[i][-1] in '.,: ; -?! ':
# заменяем строку на неё без последнего символа
# (фактически ДО последнего символа)
wrds[i] = wrds[i][: -1]
Но во-первых, а вдруг там будет случайно затесавшаяся цифра или мы не все знаки препинания вспомнили (вот скобки, например, ещё могут быть).
А во-вторых, знак может быть и в начале слова — та же скобка.
Используем метод .isalpha(), который возвращает True, если аргумент состоит только из букв. И будем проверять с обоих концов слова:
for i in range(len(wrds)):
if not(wrds[i][0].isalpha()): wrds[i] = wrds[i][1:]
if not(wrds[i][-1].isalpha()): wrds[i] = wrds[i][: -1]
4. Теперь бы надо отсортировать список строк. Но если мы будем делать это запросто:
wrds.sort()
получим (естественно!) сортировку по алфавиту, а это не то, что нам нужно.
Вспомним, что у метода .sort() есть параметр key, позволяющий сортировать элементы списка как угодно: хоть по второму символу строк, хоть по остатку от деления чисел на 11.
Причём мы можем функцию-ключ сортировки сделать отдельной функцией, вот так:
def key_func(x):
return len(x)
А можем использовать лямбда-функцию прямо в вызове метода.
Лямбда-функции (напомню) — это крохотные функции без имени, которые реализуются прямо там, где используются.
Наша сортировка по длинам строк будет выглядеть так:
wrds.sort(key=lambda x: len(x))
Параметр лямбда-функции х — это элемент списка, для которого вызывается .sort(). То есть в нашем случае — строка.
Что возвращает функция-ключ сортировки — по тому и сортируем. Здесь — по длине строк.
5. Осталось вывести наши строки. Можно, конечно, сделать это попросту:
for x in wrds:
print(x)
А можно использовать чуть более мудрёный, но краткий функциональный подход и записать так:
[print(x) for x in wrds]
Результат получим один и тот же!
Осталось переписать программу полностью и можно 💥 сдавать лабу 😉
Код программы:
s = input()
# разбиваем строку на слова
wrds = s.split()
# для всех подстрок списка
for i in range(len(wrds)):
# если последний символ - знак препинания
if wrds[i][-1] in '.,:;-?!':
# заменяем строку на неё без последнего символа
# (фактически ДО последнего символа)
wrds[i] = wrds[i][:-1]
# удаляем начальные и конечные знаки
# препинания из каждого слова
for i in range(len(wrds)):
if not(wrds[i][0].isalpha()): wrds[i] = wrds[i][1:]
if not(wrds[i][-1].isalpha()): wrds[i] = wrds[i][:-1]
# сортируем список по длинам строк
wrds.sort(key=lambda x: len(x))
# выводим по одному слову на строке
[print(x) for x in wrds]
Или можете скачать готовым файликом 🔽🔽🔽