Как отсортировать перевернутый словарь с неуникальными значениями?

#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']}