【问题标题】:How to order by key (alphabetically) in defaultdict(list) for an inverted index如何在defaultdict(list)中按键(按字母顺序)为倒排索引排序
【发布时间】:2013-11-24 14:37:50
【问题描述】:

我有一个倒排索引。它由我的词典和出现这些术语的文档的发布列表组成。我只想按字母顺序对字典进行排序。这就是它现在的样子(示例):

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

【问题讨论】:

    标签: python sorting sorted defaultdict


    【解决方案1】:

    在字典上调用sorted() 只会返回按排序顺序列出的。字典本身没有内在的顺序,你不能对它们进行排序。

    因为您将sorted() 的输出重新分配回self.index,所以您现在失去了对原始defaultdict 的引用。

    【讨论】:

    • 是的。恕我直言,调用 sorted() 更适合以有序方式查看结果,而不是重新排序数据。谢谢!
    【解决方案2】:

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

    sorted(self.index.items())
    

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

    【讨论】:

    • 这只是sorted(self.index.items()) - 无需压缩键和值
    • 感谢 Jon,相应地更新了我的帖子 :) 暂时忘记了 items()。有趣的是,如果您想按值而不是键排序,我认为您将不得不求助于 zip(self.index.values(), self.index.keys())
    • 嗯,这是一种方式......但另一种方式是为排序提供一个关键参数,例如:sorted(self.index.items(), key=lambda L: L[1]) - 这样它会保留键/值顺序......否则,你'd 必须在...之后将结果的项目反转回来......
    【解决方案3】:

    我昨天读了这篇文章,我认为这可能正是您正在寻找的。它是 Python 字典的二进制堆实现。如果您调用它,它会按排序顺序排列其项目。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-09-16
      • 1970-01-01
      • 2020-11-26
      • 1970-01-01
      • 1970-01-01
      • 2023-02-09
      • 2020-03-29
      相关资源
      最近更新 更多