Обучающая задача на сортировку и подсчет уникальных слов в списке Python
На обучающем курсе задана следующая задача:
Дан текст на языке племени Мумба-Юмба. Выведите все слова, встречающиеся в тексте, разделяя их пробелом. Слова должны быть отсортированы по убыванию их количества появления в тексте, а при одинаковой частоте появления — в алфавитном порядке.
Подсказка.
После того, как вы создадите словарь всех слов, вам захочется отсортировать его по частоте встречаемости слова. Желаемого можно добиться, если создать список, элементами которого будут кортежи из двух элементов: частота встречаемости слова и само слово. Например,
[(2, 'hi'), (1, 'what'), (3, 'is')]. Тогда стандартная сортировка будет сортировать список кортежей, при этом кортежи сравниваются по первому элементу, а если они равны — то по второму. Это почти то, что требуется в задаче, а чтобы сделать то что нужно — вспомните про параметрkeyв сортировке.
В этой задаче нужно сдать только ответ для входного файла. Ссылка на входной файл: https://docs.google.com/document/d/1Wvn0nT8MVll6Oj1KvRDWq3Z7ekV4xLg2/edit?usp=sharing&ouid=113335581115004287089&rtpof=true&sd=true Написала код для этой задачи. Вроде все корректно, все работает. Но тестирующая система не принимает ответ. Прошу подсказать, что ей не нравится в моих выходных данных. Может быть, не надо в конце знак перевода строки заменять пробелом? Вот код:
fin = open('test1.txt', 'r', encoding='utf8')
words = fin.read().replace('\n', ' ').split(' ')
words_count = dict()
words_count = dict.fromkeys(set(words), 0)
for w in words:
words_count[w] += 1
words_sorted = sorted(words_count.items(), key=lambda item: (-item[1], item[0]))
for p in words_sorted:
print(p[0], end=" ")
fin.close()
Ответы (2 шт):
Вот решение*:
from collections import defaultdict
fin = open('test1.txt', 'r', encoding='utf8')
text = fin.read().replace('\n', ' ')
words = defaultdict(int)
for line in text.splitlines():
for word in line.strip().split():
words[word] += 1
frequency = defaultdict(list)
for word, freq in words.items():
frequency[freq].append(word)
for freq, words in sorted(frequency.items(), key=lambda x: x[0], reverse=True):
for word in sorted(words):
print(word, end=' ')
*взято с CyberForum
Попробуйте вывести результат так:
print(' '.join(p[0] for p in words_sorted))
Смысл: возможно, системе не нравится лишний пробел в конце, который у вас получается из-за end=" ". В моём варианте пробел есть только между словами, но не в конце.
Можно ещё вот так добиться того же эффекта:
print(*(p[0] for p in words_sorted))