Python中最好的有序字典实现是什么?

6
我看过(也写过)一些实现。有没有被认为是最好的或正在成为标准的实现?
所谓有序字典,是指对象对其键的顺序有一定概念,类似于PHP中的数组。 PEP 372 中的odict似乎是一个很有竞争力的候选者,但并不完全清楚它是否是胜者。

2
“Best”未定义。 - S.Lott
4个回答

12
这个由Raymond Hettinger编写的程序是collections.OrderedDict在Python 2.7中的替代品: http://pypi.python.org/pypi/ordereddict collections的开发版文档称它等同于即将在Python 2.7中发布的版本,因此很可能平稳过渡到将来随Python一起发布的版本。
我已经将它放在PyPI中,因此您可以使用easy_install ordereddict进行安装,并像这样使用它:
from ordereddict import OrderedDict
d = OrderedDict([("one", 1), ("two", 2)])

ordereddict by Raymond Hettinger 看起来比 collections.OrderedDict 更短更优雅。我在想 collections.OrderedDict 有什么优点超过 Raymond 的实现。为什么标准库里的实现不如另一个好? - FrostNovaZzz
@FrostNovaZzz,collections.OrderedDict现在已经被广泛使用,因此我认为“不优雅”的差异实际上是错误修复。 - shoyer

8

我没有见过标准,似乎每个人都会自己实现(请参见这个问题的答案)。如果您可以使用PEP 372中的OrderedDict补丁,那是最好的选择。任何包含在标准库中的内容都有极大可能成为一年或两年后每个人都使用的东西。


2

collections.OrderedDict 现在应该是广泛可用的,但如果您关心性能,可以考虑使用我的包 cyordereddict 作为替代方案。它是标准库OrderedDict的Cython直接移植版本,速度提升了2-6倍。


2
Python 2.7及更高版本在collections模块中有OrderedDict,因此你应该将其视为“标准”。如果其功能足够,那么你应该使用它。
然而,其实现方法是最简化的,如果这不够用,那么你应该看看Foord/Larossa的odict或我的ordereddict,因为在这种情况下它们更适合。这两个实现都是collections.OrderedDict提供的功能的超集。两者之间的区别在于,odict是纯Python,而ordereddict是一个更快的C扩展模块。
即使提供了所需的所有功能,极简主义方法也不一定更好:例如,collections.OrderedDict最初返回嵌套在其自己的值中的OrderedDictrepr()时存在错误。如果使用旧版ordereddict的unittests的子集,就可以更早地发现这个错误。

感谢您的工作,Anthon!我想获取您的ordereddict,但是您网站上的zip和tar档案都已失效。此外,我有些担心这个项目是否还活着?我的意思是,它将来会根据Python进行更新吗?也许把它放在pip上会让它更受欢迎?我在您的网站上看到7倍的加速,不确定为什么Python开发人员没有选择这个实现作为Python的默认实现。 - jichi
@jichi 我正在将 ordereddict 迁移到 bitbucket 并使其可以通过 pip 安装。之后我还会考虑 Python 3.X 的兼容性(可能基于一个简化版本,功能更像 collections.OrderedDict)。网站上的链接应该会再次正常工作。 - Anthon
请问这个库的许可证是什么?也许你可以在 PKG-INFO 文件中添加一个许可证? - jichi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接