23 дек 2024
3 минуты

Python: выводим слова введённой строки, отсортированные по длине

Ввод и вывод нашей будущей программы
Ввод и вывод нашей будущей программы

Словами будем считать последовательности букв, разделённых пробелами. Знаки препинания не являются частью слова.

ПРИМЕР: если мы ввели строку

Моя головная боль: математика, физика, информатика.

программа должна вывести:

Моя
боль
физика
головная
математика
информатика

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]

Или можете скачать готовым файликом 🔽🔽🔽

split_words_width_sort_by_len.py
940.00
Бесплатный
Комментарии
Здесь будут комментарии к публикации