Форум программистов, компьютерный форум, киберфорум
Python: Решение задач
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
3 / 2 / 1
Регистрация: 25.11.2021
Сообщений: 11

Отсортировать словарь сначала по убыванию, потом лексикографически

11.09.2022, 18:08. Показов 2211. Ответов 6

Студворк — интернет-сервис помощи студентам
Условия:
На уроке литературы возник спор: какие слова в текстах на русском языке используются чаще всего. Для разрешения спора решили провести эксперимент — посчитать слова в большом литературном произведении.

С учетом объема решили написать программу для такой обработки текста. Произведение для анализа дают в виде текста на русском языке в кодировке UTF-8, записанного по правилам набора текстов.

Для определенности, будем считать словами непрерывные последовательности русских букв независимо от регистра максимальные по включению. Так, например, будем считать, что в строка «Соловей-Разбойник», состоит из двух слов «соловей» и «разбойник». Заметим, что в таком случае слова «ПривеТ» и «привет» — это одно и то же слово, а «Маша» и «Маше» разные.

Посчитайте частоту слов в этом тексте и выведите через пробел 50 самых частых слов по убыванию частоты.

Формат входных данных:
Входные данные содержат настоящий литературный текст в кодировке UTF-8. Текст состоит из кириллических символов в нижнем и верхнем регистрах, цифр, знаков препинания, пробелов и переводов строк. Переводы строк задаются одним символом «\n».
Суммарное число символов в входном тексте не более 10 000.

Формат выходных данных:
Выведите одну строку: 50 самых частых слов в тексте, записанных через пробел. При этом слова должны быть отсортированы по убыванию частоты, а при равенстве частот — лексикографически. Если есть несколько слов с одинаковой частотой в вывод должны быть включены лексикографически меньшие из них.

Моя проблема:
Во время вывода некоторые слова не правильно сортируются лексикографически.

Ввод:
*прикрепил файлом*

Вывод:
и не в на а с так то рот да ты фельдшер что вот его вас вы дьячок зуб
он чтоб щипцы вонмигласов дергай как лет мне тянет c ни ну отцы пальцами плюнуть по раз рвать руками руки руку сергей тебя тово только тракцию тут умеешь хирургия человек это

Ожидаемый вывод:
и не в на а с так то рот ты да фельдшер что вот его вас вы дьячок за зуб как он тут чтоб щипцы вонмигласов все вырвать дергай кузьмич лет мне сергей тебя только тянет берет вам во дай дело же извините к курятин лице мое мы нельзя ни

Мой код:
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
import sys
 
words = []
predl = list(map(str.strip, sys.stdin))
 
for i in predl:
    for j in i.replace("-", " ").replace('"', " ").replace(";", " ").replace(".", " ").replace("!", " ").replace("?", " ").replace(",", " ").replace(":", " ").replace("(", " ").replace(")", " ").lower().split():
        words.append(j)
 
while "" in words:
    del words[words.index("")]
 
slov = {}
 
for i in range(len(words)):
    counter = 0
    for j in words:
        if j == words[i]:
            counter += 1
    slov[words[i]] = counter
 
data = []
 
for i in slov.keys():
    data.append((i, slov[i]))
 
slov = sorted(sorted(data, key=lambda x: x[0]), key=lambda x: x[1], reverse=True)
for i in range(50):
    print(slov[i][0], end=" ")
Вложения
Тип файла: txt STDIN.txt (10.9 Кб, 14 просмотров)
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.09.2022, 18:08
Ответы с готовыми решениями:

Ввести словарь с клавиатуры. С помщ лямбды отсортировать словарь по убыванию ключа и вывести на экран
Ввести словарь с клавиатуры. С помощью лямбды отсортировать словарь по убыванию ключа и вывести на экран.

Дана матрица целых чисел m*n Отсортировать сначала строки, потом столбцы этой матрицы по убыванию
Дана матрица целых чисел m*n. Нужно отсортировать сначала строки, потом столбцы этой матрицы по убыванию. Сортировать нужно по максимальной...

Отсортировать массив сначала по возрастанию, потом по убыванию (не "пузырьком")
Нужно отсортировать массив сначала по возрастанию потом по убыванию(НЕ пузырковым методом). программу написал только работает криво,...

6
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4
11.09.2022, 18:26
Был у меня похожий проект
Кликните здесь для просмотра всего текста
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
import re
import docx
import pandas as pd
import pymorphy2
 
reg = re.compile('[^а-яА-ЯёЁa-zA-Z0-9 ]')
txt = []
 
doc = docx.Document("STDIN.docx")  # Загрузка файла docx
all_paras = doc.paragraphs # Все параграфы текста. Пустая строка тоже считается параграфом
 
for p in all_paras:
    if len(p.text)>0:
        for p1 in p.text.split():
            t = reg.sub('', p1)
            if len(t)>0: 
                txt.append(t)
 
df = pd.DataFrame(txt)
 
morph = pymorphy2.MorphAnalyzer()
df['NF'] = [morph.parse(i)[0].normal_form for i in df[0]]  # Начальная форма слов
 
print('Наиболее часто встречающиеся слова в тексте:') 
print(df[0].value_counts().head(20))
 
 
# Списки частиц (предлогов, местоимений, союзов и др.) для удаления из текста
prep='''без,безо,близ,в,во,вместо,вне,для,до,за,из,изо,из-за,из-под,к,ко,кроме,между,меж,на,над,о,об,обо,
от,ото,перед,передо,пред,пред,пo,под,подо,при,про,ради,с,со,сквозь,среди,у,через,чрез'''.split(',')
 
pronoun = '''я,мы,ты,вы,он,она,оно,они,себя,мой,твой,ваш,наш,свой,его,ее,их,то,это,тот,этот,такой,таков,
столько,весь,всякий,сам,самый,каждый,любой,иной,другой,кто,что,какой,каков,чей,сколько,никто,ничто,
некого,нечего,никакой,ничей,нисколько,кто-то,кое-кто,кто-нибудь,кто-либо,что-то,кое-что,что-нибудь,
что-либо,какой-то,какой-либо,какой-нибудь,некто,нечто,некоторый,некий'''.split(',')
 
un = '''а,абы,аж,ан,благо,буде,будто,вроде,да,дабы,даже,едва,ежели,если,же,затем,зато,и,ибо,или,итак,кабы,
как,когда,коли,коль,ли,либо,лишь,нежели,но,пока,покамест,покуда,поскольку,притом,причем,пускай,пусть,
раз,разве,ровно,сиречь,словно,так,также,тоже,только,точно,хоть,хотя,чем,чисто,что,чтоб,чтобы,чуть,
якобы'''.split(',')
 
dop = '''который,не,какимлибо,какойлибо,какойнибудь,всё,бы,ещё,по,ни,уже,вот,ну,её,там,тем,тут,ктото,
коекто,изза,изпод'''.split(',')
 
ls = (prep + pronoun + un + dop)
lst = sorted(list([i.replace('\n', '') for i in ls]))
 
a = df.NF.value_counts()
for i in lst: 
    a = a[a.index != i]
    
print('Наиболее часто встречающиеся слова в тексте (в нормальной форме):')
print(a.head(20))
 
import matplotlib.pyplot as plt
import seaborn as sns
 
fig, ax = plt.subplots(figsize = (14,6))
b = a.head(100)
sns.barplot(x=b.index, y=b.values)
ax.set_xticklabels(ax.get_xticklabels(),rotation = 90)
ax.set(ylim = [0, 12])
ax.set(xlim = [-1, 100])
plt.ylabel('Частота', size=12)
plt.show()
 
fig.savefig('STDIN', dpi=300, bbox_inches = 'tight')

Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Наиболее часто встречающиеся слова в тексте:
и           44
не          22
в           20
на          13
с           12
а            9
рот          8
так          7
Не           7
что          7
фельдшер     6
его          6
ты           6
щипцы        5
как          5
вас          5
то           5
да           5
вы           5
мне          4
 
Наиболее часто встречающиеся слова в тексте (в нормальной форме):
зуб         10
рука        10
рот         10
тянуть       9
фельдшер     8
дьячок       7
щипец        7
отец         5
рвать        5
садиться     5
вырвать      5
глаз         5
кузьмич      4
раскрыть     4
год          4
палец        4
сергей       4
дёргать      4
дать         4
бог          4
0
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4
11.09.2022, 18:32
0
 Аватар для VistaSV30
986 / 330 / 79
Регистрация: 10.04.2012
Сообщений: 1,239
Записей в блоге: 4
11.09.2022, 18:38
В моем коде модуль re не нужен (строки 1 и 6 надо удалить).
0
3 / 2 / 1
Регистрация: 25.11.2021
Сообщений: 11
11.09.2022, 18:49  [ТС]
К сожалению немного не то, что мне нужно. По условию задачи нужно вывести список слов *Для определенности, будем считать словами непрерывные последовательности русских букв независимо от регистра максимальные по включению.* У вас убираются множество "слов". Да и на мой вопрос вы не ответили. Нужно отсортировать вывод лексикографически
0
964 / 485 / 241
Регистрация: 02.06.2016
Сообщений: 760
11.09.2022, 21:12
GoldSky, с логикой сортировок все хорошо. Наверное, где-то в stdin не полностью данные пишутся. Посмотрите на промежуточные результаты, хотябы в конце выведите список слов и частот print(slov[i], end=" "). В файле слово 'ты' встречается 8 раз, а слово 'да' - 7, а у вас в Вывод почему-то наоборот (проверьте что там 7 и 8)
Кликните здесь для просмотра всего текста
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
('и', 44)
('не', 29)
('в', 24) 
('на', 17)
('а', 16) 
('с', 15)
('так', 10)
('то', 9)
('рот', 8)
('ты', 8)
('да', 7)
('фельдшер', 7)
('что', 7)
('вот', 6)
('его', 6)
('вас', 5)
('вы', 5)
('дьячок', 5)
('за', 5)
('зуб', 5)
('как', 5)
('он', 5)
('тут', 5)
('чтоб', 5)
('щипцы', 5)
('вонмигласов', 4)
('все', 4)
('вырвать', 4)
('дергай', 4)
('кузьмич', 4)
('лет', 4)
('мне', 4)
('сергей', 4)
('тебя', 4)
('только', 4)
('тянет', 4)
('берет', 3)
('вам', 3)
('во', 3)
('дай', 3)
('дело', 3)
('же', 3)
('извините', 3)
('к', 3)
('курятин', 3)
('лице', 3)
('мое', 3)
('мы', 3)
('нельзя', 3)
('ни', 3)
0
2431 / 1474 / 633
Регистрация: 01.11.2021
Сообщений: 2,269
11.09.2022, 22:06
Лучший ответ Сообщение было отмечено GoldSky как решение

Решение

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import sys
 
words = []
predl = list(map(str.strip, sys.stdin))
 
for i in predl:
    for j in i.replace("-", " ").replace('"', " ").replace(";", " ").replace(".", " ").replace("!", " ").replace("?",
                                                                                                                 " ").replace(
        ",", " ").replace(":", " ").replace("(", " ").replace(")", " ").lower().split():
        words.append(j)
 
while "" in words:
    del words[words.index("")]
 
slov = {}
 
for i in range(len(words)):
    counter = 0
    for j in words:
        if j == words[i]:
            counter += 1
    slov[words[i]] = counter
 
data = []
 
for i in slov.keys():
    data.append((i, slov[i]))
 
res = ' '.join(x[0] for x in sorted(data, key=lambda x: (-x[1], x[0]))[:50])
ex = 'и не в на а с так то рот ты да фельдшер что вот его вас вы дьячок за зуб как он тут чтоб щипцы вонмигласов все вырвать дергай кузьмич лет мне сергей тебя только тянет берет вам во дай дело же извините к курятин лице мое мы нельзя ни'
print(res)
print(res == ex)
Python
1
2
3
4
5
6
7
8
9
10
11
from collections import Counter
 
with open('STDIN.txt', 'r', encoding='utf-8') as f:
    text = f.read().lower()
 
tbl = str.maketrans('-";.!?:,()', '          ')
text = text.translate(tbl)
words = text.split()
 
d = Counter(words)
print(' '.join(x[0] for x in sorted(d.items(), key=lambda x: (-x[1], x[0]))[:50]))
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.09.2022, 22:06
Помогаю со студенческими работами здесь

Сортировка массива: сначала положительные числа по убыванию, потом отрицательные по возрастанию, потом нули
Заполнить массив рандомными числами от -100 включительно до 100 включительно. Отсортировать так: сначала идут положительные числа по...

Отсортировать массив — сначала отрицательные, потом нулевые, потом положительные
решить до завтра с объяснением всех букв) 1)отсортировать массив - сначала отрицательные, потом нулевые, потом положительные. ...

Как отсортировать List сначала по первому, потом по второму, потом по третьему полям
Дано лист List<Row> list1; Row - это класс с 3мя int полями. Как отсортировать лист сначала по первому, потом по второму, потом по третьему...

Отсортировать одномерный массив, сначала делятся на 5, потом на 3
Отсортировать одномерный массив, сначала делятся на 5, потом на 3. Помогите пожалуйста:cry:

Во второй массив сначала переписать сначала положительные, потом 0, потом отрицательные
Не могу решить задачу, прямо застрял на ней. Помогите, пожалуйста. Нужно: заполнить массив из 10 элементов положительными и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru