如何在defaultdict(列表)中按键(按字母顺序)为反向索引排序

时间:2013-11-24 14:37:50

标签: python sorting sorted 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']

第一个打印调用提供了一个完美的排序单词列表但如果我尝试获取单词“all”的连接发布列表,则会收到以下错误消息:

TypeError: list indices must be integers, not str

3 个答案:

答案 0 :(得分:2)

在字典上调用sorted()会按排序顺序返回的列表。字典本身没有固有的顺序,你无法对它们进行排序。

由于您已将sorted()的输出重新分配回self.index,因此您现在已丢失对原始defaultdict的引用。

答案 1 :(得分:2)

我不相信字典可以按你所指的意义排序。如果您要查看已排序的字典,您可以尝试以下操作:

sorted(self.index.items())

但请注意,结果不是字典 - 它只是一个(键,值)元组的列表,它们将在原始字典中相互关联。

答案 2 :(得分:0)

我昨天读了这篇文章,我认为这可能正是你要找的。它是Python字典的二进制堆实现。如果你打电话给它,它会按排序顺序输出它的项目。

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