Задача: написать программу, которая принимает текст и выводит два слова: наиболее часто встречающееся и самое длинное.
TEXT = """Однажды, в студёную зимнюю пору
Я из лесу вышел; был сильный мороз.
Гляжу, поднимается медленно в гору
Лошадка, везущая хворосту воз.
И, шествуя важно, в спокойствии чинном,
Лошадку ведёт под уздцы мужичок
В больших сапогах, в полушубке овчинном,
В больших рукавицах... а сам с ноготок!
«Здорово, парнище!» — «Ступай себе мимо!» —
«Уж больно ты грозен, как я погляжу!
Откуда дровишки?» — «Из лесу, вестимо,
Отец, слышишь, рубит, а я отвожу».
(В лесу раздавался топор дровосека.) —
«А что, у отца-то большая семья?» —
«Семья-то большая, да два человека
Всего мужиков-то: отец мой да я...» —
«Так вон оно что! А как звать тебя?» — «Власом». —
«А кой тебе годик?» — «Шестой миновал...
Ну, мёртвая!» — крикнул малюточка басом,
Рванул под уздцы и быстрей зашагал...
На эту картину так солнце светило,
Ребёнок был так уморительно мал,
Как будто всё это картонное было,
Как будто бы в детский театр я попал.
Но мальчик был мальчик живой, настоящий,
И дровни, и хворост, и пегонький конь,
И снег до окошек деревни лежащий,
И зимнего солнца холодный огонь —
Всё, всё настоящее русское было,
С клеймом нелюдимой, мертвящей зимы,
Что русской душе так мучительно мило,
Что русские мысли вселяет в умы, —
Те честные мысли, которым нет доли,
Которым нет смерти —
В которых так много и злобы и боли,
В которых так много любви!"""
Мы вставили текст прямо в программу, записав ее в переменную TEXT при помощи оператора присваивания =.
Поскольку переменную с текстом изменять не планируется, ее следует считать константой и записывать название заглавными буквами.
При работе с большими объемами текстовой информации текст загружается из отдельного файла.
Встроенная функция open() по умолчанию открывает файл по указанному имени и пути к нему в режиме чтения.
Функция возвращает объект типа file, у которого есть методы open() и close().
При возникновении проблем с кодировкой ее можно указать при открытии файла.
txtfile = open("warandpeace.txt", encoding="utf-8")
TEXT = txtfile.read()
txtfile.close()
В третьей версии языка подобная операция делается с использованием ключевых слов with и as:
with open("warandpeace.txt", encoding="utf-8") as txtfile:
TEXT = txtfile.read()
Количество слов легко подсчитать при помощи метода split().
Количество символов – длина строки, полученной при сложении всех слов.
words = TEXT.split()
print(len(words)) # Вывести на экран количество слов
print(len("".join(words))) # Вывести на экран количество символов
wordsdict = {}
for word in words:
word = word.lower().strip('"').strip("(").strip("!").strip("«").rstrip("...»").strip(",")
if word not in wordsdict:
wordsdict[word] = 1
else:
wordsdict[word] = wordsdict[word] + 1
wordslist = sorted(wordsdict.items(), key=lambda x: x[1], reverse=True)
print(wordslist)
longest = ""
wordsfreq = []
for word in wordsdict:
wordsfreq.append((word, wordsdict[word]))
if len(word) > len(longest):
longest = word
wordsfreq.sort(key=lambda row: row[1], reverse=True)
print(wordsfreq == wordslist)
dct = {}
for word in wordsfreq:
dct.update({word[0]: word[1]})
print(dct)
Медианное среднее
import statistics as st
TEXT = """Здесь текст для анализа.
Add text here.
"""
word_lens = []
for word in TEXT.split():
word_lens.append(len(word))
median_val = st.median(word_lens)
mean_val = st.mean(word_lens)
print("Медианное среднее:", median_val, "Среднее:", mean_val, "Разница:", median_val - mean_val)
Ссылки
- Закон Ципфа
– эмпирическая закономерность распределения частоты слов естественного языка: если все слова языка (или просто достаточно длинного текста) упорядочить по убыванию частоты их использования, то частота n-го слова в таком списке окажется приблизительно обратно пропорциональной его порядковому номеру n. - Анализ текста онлайн
- Текстовая обработка в языке Python
- Regexp и Python: извлечение токенов из текста
- Обработка текста
- NLP – это весело! Обработка естественного языка на Python
- Библиотека textwrap
Условие
Дан текст: в первой строке записано число строк, далее идут сами строки. Определите, сколько различных слов содержится в этом тексте.
Словом считается последовательность непробельных символов идущих подряд, слова разделены одним или большим числом пробелов или символами конца строки.
s_text = set()
for i in range(int(input().rstrip())):
s = {j for j in (str(input()).split())}
s_text = s_text.union(s)
print(len(s_text))
Решение разработчиков
1
2
3
4
5
words = set()
for _ in range(int(input())):
words.update(input().split())
print(len(words))
Случайные решения участников
Владимир Щеглов
1
2
3
4
5
6
7
n = int(input())
b = set()
for i in range(n):
a = set(input().split())
b |= a
print(len(b))
Владимир Шакиров
1
2
3
4
5
n = int(input())
words = set()
[words.update( set(input().split())) for i in range(n)]
print(len(words))
Olga Sed
1
2
3
4
5
6
n = int(input())
sset = set()
for i in range(n):
sset = sset.union(set(input().split()))
print(len(sset))
Елена Горохова
1
2
3
4
5
6
7
8
n=int(input())
b=set()
for i in range(n):
a=input().split(" ")
for el in a:
b.add(el)
print(len(b))
Andrey Platonov
1
2
3
4
5
words = set()
for i in range(int(input())):
words.update(input().split())
print(len(words))
ElatedMIndGjs 1 / 1 / 0 Регистрация: 17.05.2021 Сообщений: 5 |
||||||||
1 |
||||||||
«Программа подсчета слов»17.05.2021, 01:11. Показов 2316. Ответов 12 Метки нет (Все метки)
Вопрос по статье с сайта ( https://metanit.com/python/tutorial/5.4.php ) Есть код:
Объясните пожалуйста, как работает данный цикл?
В статье написано: «Получаем словарь из слов, где ключ — это уникальное слово, а значение — количество вхождений данного слова в тексте.» Каким образом мы обращаемся к пустому словарю, перебирая в нем слова? Буду благодарен за подробный ответ.
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
17.05.2021, 01:11 |
Ответы с готовыми решениями: Создать родительский класс «Склад» и 3 подкласса («принтеры»,» сканеры», «ксероксы») Дан список станций желтой ветки московского метро: line = [«Третьяковская», «Марксистская», «Площадь Ильича», «Авиамотор Программа на Python «» репетитор по английскому «» Написать программу проверки правильности написания сочетаний «жи», «ши», «ча», «ща» 12 |
1 / 1 / 0 Регистрация: 17.05.2021 Сообщений: 5 |
|
17.05.2021, 11:01 [ТС] |
2 |
upp
0 |
Fudthhh Модератор 2741 / 1535 / 504 Регистрация: 21.02.2017 Сообщений: 4,126 Записей в блоге: 1 |
||||
17.05.2021, 11:18 |
3 |
|||
ElatedMIndGjs,
Каким образом мы обращаемся к пустому словарю, перебирая в нем слова? Чаво? Ты передаешь в функцию список слов, проходишься по этому списку циклом, проверяешь есть ли в словаре ключ который равен текущему слову, если да, то увеличиваешь на 1 значение, иначе создаешь ключ со значением один, по сути написано очень криво. Добавлено через 3 минуты
0 |
Автоматизируй это! 6740 / 4298 / 1162 Регистрация: 30.03.2015 Сообщений: 12,641 Записей в блоге: 29 |
|
17.05.2021, 11:19 |
4 |
Каким образом мы обращаемся к пустому словарю, перебирая в нем слова? ну это он в начале пустой, а потом мы начинаем в него совать пары ключ значение в стиле слово:1
первое слово является ключом для второго. нет. Там работает так —
Каким образом мы получаем «значение = количество вхождений данного слова в тексте.», если значение = следующему слову в тексте? именно вышеописанным. Ключ -слово, значение -число (количесто вхождений)!
0 |
КулХацкеръ |
17.05.2021, 11:25
|
Не по теме: Welemir1, как же ты хорош! Просто и понятно разжевал. Я так не умею, мне проще кинуть код, чем объяснять что-то…
0 |
Автоматизируй это! 6740 / 4298 / 1162 Регистрация: 30.03.2015 Сообщений: 12,641 Записей в блоге: 29 |
|
17.05.2021, 11:31 |
6 |
КулХацкеръ,
0 |
1 / 1 / 0 Регистрация: 17.05.2021 Сообщений: 5 |
|
17.05.2021, 12:19 [ТС] |
7 |
Ну я примерно понял.
0 |
Автоматизируй это! 6740 / 4298 / 1162 Регистрация: 30.03.2015 Сообщений: 12,641 Записей в блоге: 29 |
|
17.05.2021, 13:01 |
8 |
Ну я примерно понял. нет, не понял, к сожалению
Единственный оставшийся вопрос: как переменная «words_dict = dict()» получает наш список слов? не получает, он ПУСТОЙ! мы в цикле по 1 слову туда суем (но если слово уже есть то просто инкрементим переменную)
Т.е. мы просто создали пустой словарь и он автоматически наполнился списком слов, потому что в параметре функции написано «words»? нет! у нас есть цикл! может бросить пока этот сайт(метанит) и взять книгу? тема -циклы, функции, словари
1 |
Fudthhh |
17.05.2021, 13:10
|
Не по теме: Welemir1, отправь Лутца уже читать его, тут только он поможет.
0 |
1 / 1 / 0 Регистрация: 17.05.2021 Сообщений: 5 |
|
17.05.2021, 13:26 [ТС] |
10 |
А все я понял. Цикл сам добавляет по одному слову-номеру в словарь. 1)Цикл перебирает слова из списка.
1 |
Автоматизируй это! 6740 / 4298 / 1162 Регистрация: 30.03.2015 Сообщений: 12,641 Записей в блоге: 29 |
|
17.05.2021, 13:27 |
11 |
Сообщение было отмечено ElatedMIndGjs как решение РешениеElatedMIndGjs, бинго!
1 |
1 / 1 / 0 Регистрация: 17.05.2021 Сообщений: 5 |
|
17.05.2021, 13:28 [ТС] |
12 |
Спасибо!
0 |
Fudthhh |
17.05.2021, 15:11
|
Не по теме: Welemir1, я написал тоже самое, а он прочитав задал кучу вопросов, и разбил мой ответ на список(
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
17.05.2021, 15:11 |
Программа подсчёта слов Программа для подсчета символов и слов в тексте В идеале мне нужно… Определить количество слов в строке, которые начинаются на букву «b» Найти количество слов,которые содержат ровно 3 буквы «А» Дана строка, содержащая русскоязычный текст. Найти количество слов, начинающихся с буквы «а» Дана строка, содержащая русскоязычный текст. Найти количество слов, начинающихся с буквы «е» Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 13 |
Программирование на языке
Python.
Практическая работа № 6.
Обработка символьных строк
Задание
1. Две строки
Составьте
программу, которая предлагает ввести с клавиатуры две строки a
и b, а затем:
1.
соединяет
их в новую строку c
и выводит результат
2.
определяет
количество символов в новой строке c
3.
выводит
на экран более длинную из строк a
и b
4.
выводит
на экран большую из строк a
и b
Задание 2. Составление
слов
Составьте
программу, которая из слова ИФОРМАТИКА получает слова:
1.
ФОРМА
2.
ФИРМА
3.
МАК
Задание
3. Работа со словами строки
Дана
строка, состоящая из слов, разделенных пробелами. Вывести самое длинное слово
в строке количество букв в нем.
Задание
4. Число слов в строке
Дана
строка, состоящая из слов, разделенных пробелами. Определите, сколько в ней слов.
Задание 5.
Замена букв
Дана
строка, состоящая из слов, разделенных пробелами. Заменить строчные буквы, а
на б и прописные A на B. Вывести получившуюся строку и количество замененных
букв в ней.
Задание
6. Число слов в строке
Дана
строка, состоящая из слов, разделенных пробелами. Определите, сколько в ней
слов.
Задание
7. Число слов, начинающихся на букву R
Дана
строка, состоящая только из заглавных латинских букв и пробелов. Словом,
назовём последовательность символов, не содержащую пробелов и ограниченную
пробелами, началом или концом строки. Требуется найти количество слов в
заданной строке, которые начинаются на букву «R».
Задание
8. Удаление символов
Дана
строка. Удалите из этой строки все символы*.
Задание 9.
Две половинки
Дана строка.
Разрежьте ее на две равные части (если длина строки — четная, а если длина
строки нечетная, то длина первой части должна быть на один символ больше).
Переставьте эти две части местами, результат запишите в новую строку и выведите
на экран.
Задание 10.
Переставить два слова
Дана строка, состоящая
ровно из двух слов, разделенных пробелом. Переставьте эти слова местами.
Результат запишите в строку и выведите получившуюся строку.
Задание 11.
ФИО
С
клавиатуры вводится строка, содержащая имя, отчество и фамилию человека, например,
Петров Михаил Николаевич
Каждые
два слова разделены одним пробелом, в начале строки пробелов нет. В результате
обработки должна получиться новая строка, содержащая фамилию и инициалы: М.Н. Петров
Задание 12.
Поиск в файле строк, содержащих определенные значения
В
текстовый файл построчно записаны фамилия имя учащихся класса и его оценка за
контрольную работу. Вывести на экран всех учащихся, чья оценка меньше 4 баллов
и посчитать средний балл по классу.
Варианты решения к некоторым
задачам
Задание
3. Работа со словами строки
Дана
строка, состоящая из слов, разделенных пробелами. Вывести самое длинное слово
в строке количество букв в нем.
Код
Python
s = input()
s = s.split()
count = 0
for i in s:
if len(i)>count:
count = len(i)
word = i
print(word)
print(len(word))
Задание
6. Число слов в строке
Дана
строка, состоящая из слов, разделенных пробелами. Определите, сколько в ней
слов.
Код
Python
print(
input().count(' ') +
1)
# или
вот так
s = input()
s =
s.split()
n =
len(s)
print(n)
Задание 7. Число слов, начинающихся
на букву R
Дана
строка, состоящая только из заглавных латинских букв и пробелов. Словом,
назовём последовательность символов, не содержащую пробелов и ограниченную пробелами,
началом или концом строки. Требуется найти количество слов в заданной строке,
которые начинаются на букву «R».
Код
Python
S =
input().split()
c = 0
for
each in S:
if each[0] == 'R':
c += 1
print(c)
Задание 8.
Удаление символов
Дана
строка. Удалите из этой строки все символы*.
print(input().replace(‘*’, »))
Задание 9.
Две половинки
Дана строка.
Разрежьте ее на две равные части (если длина строки — четная, а если длина
строки нечетная, то длина первой части должна быть на один символ больше).
Переставьте эти две части местами, результат запишите в новую строку и выведите
на экран.
Код
Python
s =
input()
print(s[(len(s) +
1) //
2:] +
s[:(len(s) +
1) //
2])
Задание
10. Переставить два слова
Дана строка, состоящая
ровно из двух слов, разделенных пробелом. Переставьте эти слова местами.
Результат запишите в строку и выведите получившуюся строку.
Код
Python
s = input()
word1 = s[:s.find(‘ ‘)]
word2 = s[s.find(‘ ‘) + 1:]
print(word2
+ ‘
‘ + word1)
Задание 11.
ФИО
С
клавиатуры вводится строка, содержащая имя, отчество и фамилию человека,
например, Михаил Николаевич Петров
Каждые
два слова разделены одним пробелом, в начале строки пробелов нет. В результате
обработки должна получиться новая строка, содержащая фамилию и инициалы: Петров
М.Н.
Код
Python
print ( «Введите имя, отчество и фамилию:» )
s = input()
fio = s.split()
s = fio[1][0] + «.» + fio[2][0] + «.» +
» » + fio[0]
print(s)
Задание
12. Поиск в файле строк, содержащих определенные значения
В
текстовый файл построчно записаны фамилия имя учащихся класса и его оценка за
контрольную работу. Вывести на экран всех учащихся, чья оценка меньше 4 баллов
и посчитать средний балл по классу.
Код
Python
f = open(«class10.txt»)
sum = 0
n = 0
for s in f:
s = s.split()
d = int(s[2])
sum += d
n += 1
if d < 4:
print(s[0], s[1] , s[2])
f.close()
print(‘Средний балл %.2f’
%(sum/n))
На уроке «Python. Взлом шифров. продолжение-2» я обещал рассказать о работе с текстом. Начнем со строк. Строки в Python-е, как и в PHP и JavaScript, могут заключаться в двойные или одинарные кавычки:
s1="Это строка" s2='Это тоже строка' print (s1) print (s2)
Это позволяет создать строки с кавычками внутри (либо с апострофами внутри):
s1="Внутри кавычек могут быть 'апостофы' ''''" s2='А внутри апостофов "кавычки" """ ' print (s1) print (s2)
Еще есть такая фича, как тройные кавычки. Они позволят задать многострочный стринг:
s="""Это первая строка а это вторая и третья и четвертая""" print (s)
Другой способ задания многострочного текста — это использование символов «n», хотя первый способ зачастую более наглядный. Вот этот код выполнит тоже самое:
s="Это первая строкаnа это втораяnи третьяnи четверая" print (s)
Строки можно складывать (конкатенация):
s="Hello "+"word" print (s)
Можно умножить строку на число, в этом случае она дублируется столько раз, на сколько ее умножили:
s="Hello "*3 print (s)
Но при попытке умножить на дробное число выйдет ошибка:
«Traceback (most recent call last):
File «D:/Самообразование/Python работа с тектом/text6.py», line 3, in <module>
s=»Hello «*3.1
TypeError: can’t multiply sequence by non-int of type ‘float’»
Аналогично не «прокатит» и умножение строки на строку, так как данная операция не имеет смысла.
Кстати, при умножении строки на число от перестановки множителей произведение не меняется:
s=3*"Hello " print (s)
Такой код выдаст тоже самое, что и предыдущий. А вот со сложением данный номер не пройдет, так как там просто вторая строка с конца присоединяется к перовой.
К символам строки можно обращаться как к элементам массива, счет при этом начинается с нуля. Например, вот такой код вернет запятую:
s="Hello, world! " print (s[5])
Можно использовать срез. Например, вот такая программа вернет «lo,»:
s="Hello, world! " print (s[3:7])
Самый прикол, что можно получить каждый второй, каждый третьи и так далее символ из среза, например, каждый второй:
s="Hello, world! " print (s[1:10:2])
Такая программа вернет строку: «el,wr», а вот такая:
s="Hello, world! " print (s[1:10:3])
Вернет: «eow».
А еще в срезе могут быть отрицательные значения, это значит, что брать надо с конца. Например, если мы хотим получить предпоследний символ, мы можем написать [-2]. А вот если обратиться так: [:-2] то программа вернет все символы, кроме последних двух.
Теперь пара практических задач.
Задача 1. Дана строка со списком слов, разделенных пробелами. Надо найти самое длинной слово.
Решение. Вспомним урок Python. Взлом шифров. Продолжение, где для распарсиваняи строки мы использовали split. Тут поступим точно так же, распарсим строку, превратив ее в список, переберем все элементы списка, используя классический алгоритм поиска максимума:
s="а на к в игра слово параллелепипед велосипед в не у компьютер" ls=s.split(" ") max_len=0 word="" for el in ls: word_len=len(el) if word_len>max_len: max_len=word_len word=el print("Слово с максимальной длиной: "+word)
Программа вернет «Слово с максимальной длиной: параллелепипед».
Задача 2. Необходимо анализировать сигнал. Этот сигнал состоит из цифр от 0 до 9 и знака #. Две и более идущие цифры подряд обозначают эту цифру. Если цифра должна повторяться, то это обозначается двумя или более знаками # (предыдущая цифра повторяется). Одинарная цифра или знак # считается помехой и не должен учитывается. Например, сочетание «12233##577766###» обозначает «233766».
Решение. Будем анализировать строку сигнала в цикле, меняя режим цикла, если идут два и более символа подряд. Последний символ и последнюю цифру запоминаем. Символ запоминаем чтобы отследить, что иду два и более подряд, а цифру для того, чтобы знак «#» удвоил ее.
Вот такая получается программа:
source_str="12233##577766###" last_digit="" last_simbol="" dist_str="" str_len=len(source_str) i=0 is_wait=True while i<str_len: simb=source_str[i] if simb==last_simbol: if not is_wait: if simb=="#": dist_str=dist_str+last_digit else: dist_str=dist_str+simb last_digit=simb is_wait=True else: is_wait=False last_simbol=simb i=i+1 print(dist_str)