2013-11-24 2 views
0

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

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 

ответ

2

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

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

+0

yep. Вызов IMHO sorted() лучше для просмотра результатов упорядоченным способом, а не для переупорядочения данных. Спасибо за это! – user2618343

2

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

sorted(self.index.items()) 

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

+1

Это просто 'sorted (self.index.items())' - не нужно застегивать ключи и значения –

+0

Спасибо, Jon, обновил мое сообщение соответственно :) Забыл о пунктах() на секунду. Интересно, однако, если вы хотите сортировать по значению, а не по ключу, я думаю, вам придётся прибегнуть к zip (self.index.values ​​(), self.index.keys()) –

+0

Ну, это один из способов ... но другой должен был бы предоставить ключевой аргумент для сортировки, например: 'sorted (self.index.items(), key = lambda L: L [1])' - таким образом он сохраняет порядок ключа/значения ... В противном случае вам придется отменить элементы результата после ... –

0

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

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

Смежные вопросы