Как упорядочить по ключу (в алфавитном порядке) в defaultdict(list) для инвертированного индекса

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

self.index = 
defaultdict(<type 'list'>, {
'all': [['d03', array('I', [32L, 40L)], ['d07', array('I', [32L, 40L, 47L])], ['d05', array('I', [32L, 40L, 47L])]],
'just': [['d03', array('I', [11L])], ['d07', array('I', [11L])], ['d05', array('I', [11L])], ['d08', array('I', [11L])]])
'collect': [['d04', array('I', [24L])]]
'occurring': [['d03', array('I', [34L])], ['d07', array('I', [34L])]

... и так далее, вот как это должно выглядеть после сортировки:

'all': [['d03', array('I', [32L, 40L)], ['d07', array('I', [32L, 40L, 47L])], ['d05', array('I', [32L, 40L, 47L])]],
'collect': [['d04', array('I', [24L])]]
'just': [['d03', array('I', [11L])], ['d07', array('I', [11L])], ['d05', array('I', [11L])], ['d08', array('I', [11L])]])
'occurring': [['d03', array('I', [34L])], ['d07', array('I', [34L])]

что я пробовал:

self.index = sorted(self.index)
print self.index
print self.index['all']

первый вызов печати предоставляет идеально отсортированный список слов, но если я попытаюсь получить подключенный список сообщений для слова «все», я получаю это сообщение об ошибке:

TypeError: list indices must be integers, not str

person user2618343    schedule 24.11.2013    source источник


Ответы (3)


Вызов sorted() для словаря возвращает просто список ключей в отсортированном порядке. Сами словари не имеют внутреннего порядка, вы не можете их сортировать.

Поскольку вы переназначили вывод sorted() обратно в self.index, теперь вы потеряли ссылку на исходный defaultdict.

person Martijn Pieters    schedule 24.11.2013
comment
Ага. ИМХО вызов sorted() лучше для просмотра результатов в упорядоченном виде, а не для изменения порядка данных. Спасибо за это! - person user2618343; 26.11.2013

Я не верю, что словари можно сортировать в том смысле, о котором вы говорите. Если вы хотите просмотреть отсортированный словарь, попробуйте следующее:

sorted(self.index.items())

Однако обратите внимание, что результат не является словарем - это просто список кортежей (ключ, значение), которые будут связаны друг с другом в исходном словаре.

person Michael Aquilina    schedule 24.11.2013
comment
Это просто sorted(self.index.items()) - не нужно архивировать ключи и значения - person Jon Clements♦; 24.11.2013
comment
Спасибо, Джон, соответственно обновил мой пост :) На секунду забыл про items(). Интересно, однако, что если вы хотите сортировать по значению, а не по ключу, я думаю, вам придется прибегнуть к zip(self.index.values(), self.index.keys()) - person Michael Aquilina; 24.11.2013
comment
Ну, это один из способов... но другой - предоставить ключевой аргумент для сортировки, например: sorted(self.index.items(), key=lambda L: L[1]) - таким образом он сохраняет порядок ключ/значение... В противном случае вам придется поменять местами элементы результата обратно после... - person Jon Clements♦; 24.11.2013

Я прочитал это вчера, и я думаю, что это может быть именно то, что вы ищете. Это реализация Binary Heap для словарей Python. Он выводит свои элементы в отсортированном порядке, если вы вызываете для него for .

http://code.activestate.com/recipes/117228-priority-dictionary/

person Christoph Hegemann    schedule 24.11.2013