Есть ли способ вывести 50 ключей с наибольшими значениями в словаре?

У меня есть словарь, в котором содержится слово и количество его повторений в тексте. Мне необходимо вывести 50 слов, которые повторяются чаще всего. Я решил помещать все слова в словарь, а если они уже там есть, просто увеличивать счетчик (т.е. значение). Теперь я не могу найти способ, чтобы как-то отфильтровать ключи с наибольшими значениями. Идей нет никаких. Вместо переменной с текстом там будет текст из файла, имя которого даётся через input, но это сейчас не особо важно, как мне кажется. Заранее спасибо за помощь.

word_list = {}
example = 'Пример текста, текста, но, но, но, несмотря на что-то, который является пример, слово, слово, слово, слово.'.lower()
for p in string.punctuation:
    if p in example:
        example = example.replace(p, '')
right = str.split(example)

for word in right:
    if word in word_list:
        counter =  word_list[word] + 1
        word_list[word] = counter
    else:
        word_list[word] = 1

sorted_dict = {}
sorted_keys = sorted(word_list, key=word_list.get)  

for w in sorted_keys:
    sorted_dict[w] = word_list[w]

print(sorted_keys)

list_of_popular_words = []

Ответы (2 шт):

Автор решения: CrazyElf

Вы уже отфильтровали слова по возрастанию счётчика слов (значения словаря). Осталось только взять 50 последних элементов этого отсортированного списка (сортировка делается по умолчанию в возрастающем порядке, поэтому нужно брать последние элементы, а не первые):

list_of_popular_words = sorted_keys[-50:]
→ Ссылка
Автор решения: Stanislav Volodarskiy

Ваша задача - идеальный повод для прогулки по стандартной библиотеке Python.

import collections
import heapq
import string


example = 'Пример текста, текста, но, но, но, несмотря на что-то, который является пример, слово, слово, слово, слово.'.lower()

Убрать всю пунктуацию из текста можно за один проход (вместо 32). str.translate и str.maketrans образуют странную, но рабочую пару:

# 'пример текста текста но но но несмотря на чтото который является пример слово слово слово слово'
words = example.translate(str.maketrans('', '', string.punctuation))

collections.Counter считает вхождения слов:

# ('пример', 2) ('текста', 2) ('но', 3) ('несмотря', 1) ('на', 1) ('чтото', 1) ('который', 1) ('является', 1) ('слово', 4)
c = collections.Counter(words.split())

Из полученного словаря выделим пары и выпишем их в формате (счётчик, слово):

# (2, 'пример') (2, 'текста') (3, 'но') (1, 'несмотря') (1, 'на') (1, 'чтото') (1, 'который') (1, 'является') (4, 'слово')
g = ((n, w) for w, n in c.items())

Выделим три самых больших элемента с помощью heapq.nlargest. Это быстрее и требует меньше памяти чем сортировка:

# (4, 'слово') (3, 'но') (2, 'текста')
g = heapq.nlargest(3, g)

Уберём счётчики:

# ['слово', 'но', 'текста']
answer = [p[-1] for p in g]
→ Ссылка