@DVoropaev
Ставлю + к карме на хабре за ответы на вопросы

Как сортировать словарь по содержимому (Python3)?

Задача:
Написать программа, которая читает текстовый файл и производит статистический анализ символов (русский алфавит, остальные символы игнорировать), затем выводит результат в формате:
буква: частота появления

Что у меня вышло:
#!/usr/bin/env python3
import string

fileName = "text.txt"   # отсюда берем текст для анализа
outFileName = "result.txt" # сюда записываем результат
count = 0 # всего символов русского алфавита
dict = {}  # буква:сколько раз встречалась


f = open(fileName, "rt", encoding="utf8")
for line in f:
	line = str(line).upper() # переводим в одинаковый регистр
	for i in range(len(line)):
		if line[i] >= 'А' and line[i] <= 'Я': #проверяем на принадлежность русскому алфавиту
			if line[i] in dict:
				dict[line[i]] = dict[line[i]]+1
			else:
				dict[line[i]] = 1
			count = count + 1;
f.close();
f = open(outFileName, "wt", encoding="utf8")

f.write(str(count) + "\n") # сколько всего букв
for key in dict:
	f.write(str(key) + ":" + str(round(float(dict[key])/count, 3)) + "\n") # подсчет частоты
f.close()

Пример работы

вход

ААААА
ББББ
ВВВ
ABC

вывод

12
А:0.417
Б:0.333
В:0.25

Что необходимо еще:
Нужно чтобы вывод был отсортирован по частоте появления букв. Как это сделать? Насколько мне известно, словари в питоне не поддаются сортировке.
  • Вопрос задан
  • 2162 просмотра
Решения вопроса 1
NeiroNx
@NeiroNx
Программист
Надо почитать документацию...
>>> x = {1: 2, 3: 4, 4: 3, 2: 1, 0: 0}
>>> sorted_by_value = sorted(x.items(), key=lambda kv: kv[1])
>>> sorted_by_value
[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]
>>> dict(sorted_by_value)
{0: 0, 2: 1, 1: 2, 4: 3, 3: 4}
>>>

тут все написанно про сортировку: https://docs.python.org/3/howto/sorting.html
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
ScriptKiddo
@ScriptKiddo
# -*- coding: utf-8 -*-

from collections import Counter
from collections import OrderedDict


fileName = "text.txt"  # отсюда берем текст для анализа
outFileName = "result.txt"  # сюда записываем результат

letters = 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ'

with open(fileName, encoding='utf-8') as f:
    text = f.read().replace('\n', '')

text = ''.join([x.upper() for x in text if x.upper() in letters])
occurs = {key: value / len(text) for key, value in Counter(text).items()}
occurs_sorted = OrderedDict(reversed(sorted(occurs.items(), key=lambda x: x[1])))

with open(outFileName, "wt", encoding="utf8") as f:
    f.write(f'{len(text)}\n')
    for k, v in occurs_sorted.items():
        f.write(f'{k}:{v:.3f}\n')
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы