#python #dictionary
#python #словарь
Вопрос:
Итак, для моей проблемы я должен взять предоставленный словарь с неуникальными значениями, который подсчитывает частоты слов, и инвертировать его.
Моя проблема в том, что я не знаю, как отсортировать значения в алфавитном порядке (пример. 1: [‘jump’, ‘jam’] необходимо отсортировать, чтобы он показывал 1: [‘jam’, ‘jump’], где ‘jump’ и ‘jam’ оба появляются один раз в предоставленном словаре) У меня есть код для инвертирования словаря, но значения не отсортированы.
def inverted_word_counts(word_count_dict):
inverted_dict = {}
for key, value in word_count_dict.items():
inverted_dict.setdefault(value, list()).append(key)
return inverted_dict
Комментарии:
1. Можете ли вы предоставить свои входные данные и пример вывода?
2.
sorted
будет сортировать строки в алфавитном (читай: лексикографическом) порядке.3. Сравнение двух строк автоматически отсортирует их по буквам. Итак, ‘jam’ меньше, чем ‘jump’, потому что a < u приведенный вами пример также предназначен для списка, а не для словаря
4. Сортировка списка довольно хорошо описана в доступной документации. Где вы застряли?
5. входной словарь: {‘bug’: 2, ‘jump’: 1, ‘jam’: 1} и ожидаемое: {2: [‘bug’], 1: [‘jam’, jump]} но то, что я получаю, это переход перед jam, не отсортированным по алфавиту
Ответ №1:
Вы можете использовать модуль bisect для вставки ваших новых значений, сохраняя порядок сортировки. Это может быть эффективнее, чем сортировка в конце, и намного эффективнее, чем сортировка на каждой итерации цикла.
Например:
import bisect
d = {'dog':20, 'darn':20, 'dirg':20, 'apple':10, 'zebra':10,'cat':10}
def inverted_word_counts(word_count_dict):
inverted_dict = {}
for key, value in word_count_dict.items():
bisect.insort(inverted_dict.setdefault(value, list()), key)
return inverted_dict
inverted_word_counts(d)
# {20: ['darn', 'dirg', 'dog'], 10: ['apple', 'cat', 'zebra']}