Глава 12 · Множество увлекательных мини-проектов!
Проект: анализатор текста и частота слов
Строки, циклы, множества и словари — впервые вместе, в одной программе, которая рассказывает о тексте больше, чем видно на первый взгляд.
Используем
stringsциклыlistsetdictУровень
★★★ интеграционный
Результат
текстовый отчёт
Что создаём
Программу, которая получает предложение и считает про него всё интересное: сколько символов, слов, уникальных слов и какое слово встречается чаще всего.
Введите текст: Python is great and python is fun
Символов: 33
Слов: 7
Уникальных слов: 5
Самое частое слово: 'python' — 2 раз(а)
Конвейер обработки данных
Почему set()
Множество естественно устраняет повторы (глава 11) — количество уникальных слов равно просто
len(set(words)), без единой ручной проверки.Этап 1 — базовые подсчёты
analizator_etap1.py
text = input("Введите текст: ")
words = text.split()
print("Символов:", len(text))
print("Слов:", len(words))
Этап 2 — уникальные слова
analizator_etap2.py
normalized = text.lower().split()
unikalnye = set(normalized)
print("Уникальных слов:", len(unikalnye))
Без .lower() 'Python' и 'python' — разные слова
Строки сравниваются посимвольно и с учётом регистра (глава 8) —
"Python" != "python". Если забыть .lower() перед подсчётом уникальных слов, они посчитаются как два разных слова.Этап 3 — частота слов
Тот же алгоритм, что подробно разбирался в главе 11 (§11.24) — теперь как часть более крупной программы:
chastota_slov.py
counts = {}
for word in normalized:
counts[word] = counts.get(word, 0) + 1
| word | старое значение | новое значение |
|---|---|---|
| python | 0 (get вернул 0) | 1 |
| is | 0 | 1 |
| great | 0 | 1 |
| and | 0 | 1 |
| python | 1 | 2 |
| is | 1 | 2 |
Находим самое частое слово
samoe_chastoe.py
samoe_chastoe = max(counts, key=counts.get)
print(f"Самое частое слово: {samoe_chastoe!r} — {counts[samoe_chastoe]} раз(а)")
max() с key — не только для чисел
max(counts, key=counts.get) перебирает КЛЮЧИ словаря (глава 11) и выбирает тот, для которого counts.get(ключ) максимален — компактный способ найти «самое частое» без ручного цикла со сравнением.Финальный код
analizator_teksta.py
text = input("Введите текст: ")
normalized = text.lower().split()
unikalnye = set(normalized)
counts = {}
for word in normalized:
counts[word] = counts.get(word, 0) + 1
samoe_chastoe = max(counts, key=counts.get)
print("Символов:", len(text))
print("Слов:", len(normalized))
print("Уникальных слов:", len(unikalnye))
print(f"Самое частое слово: {samoe_chastoe!r} — {counts[samoe_chastoe]} раз(а)")
Debug Lab
Если посчитать len(unikalnye) из слов БЕЗ
.lower(), а частоту слов — уже ПОСЛЕ приведения к нижнему
регистру, эти два числа могут не biться друг с другом. Почему?
Используйте один и тот же нормализованный список везде
Если
unikalnye считается из необработанных слов, а counts — из normalized, то «Python» и «python» попадут в unikalnye как два разных слова, а в counts — как одно. Всегда считайте от одного и того же, уже нормализованного, списка.Практика: анализатор текста — символы, слова, уникальные слова
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки
Практика: частота слов и самое частое слово
Интерактивный ноутбук прямо в браузере — Python 3.14 через Pyodide, без установки