我已经看过(并且写过)了许多这样的实现。是否有一个被认为是最好的或正在成为一个标准?
我对有序dict的意思是该对象有一些键的顺序概念,类似于PHP中的数组。
来自PEP 372的冒险似乎是一个强有力的候选人,但并不完全清楚它是赢家。答案 0 :(得分:12)
雷蒙德·海廷格(Raymond Hettinger)的这个版本是将在Python 2.7中出现的collections.OrderedDict的替代品:http://pypi.python.org/pypi/ordereddict
集合文档的开发版本说它相当于Python 2.7中的内容,所以它很可能是顺利过渡到Python附带的版本。
我把它放在PyPI中,所以你可以用easy_install ordereddict
安装它,并像这样使用它:
from ordereddict import OrderedDict
d = OrderedDict([("one", 1), ("two", 2)])
答案 1 :(得分:8)
我没有看到标准;每个人似乎都在推动自己(见this question的答案)。如果您可以使用PEP 372中的OrderedDict
patch,这是您最好的选择。 stdlib中包含的任何东西很有可能成为每个人从现在开始使用一年或两年的东西。
答案 2 :(得分:2)
collections.OrderedDict
现在应该可以广泛使用,但如果考虑到性能,您可以考虑使用我的包cyordereddict作为替代方案。它是标准库的OrderedDict到Cython的直接端口,速度提高了2-6倍。
答案 3 :(得分:1)
Python 2.7及更高版本在collections
模块中有OrderedDict,因此您应该将其视为'标准'。如果它的功能足够你应该使用它。
然而,它的实现方法是简约的,如果这还不够,你应该看看Foord / Larossa的odict或ordereddict(由我),因为在那种情况下那些更合适。这两种实现都是collections.OrderedDict
提供的功能的超集。两者之间存在差异,odict
是纯python而ordereddict
是一个更快C
扩展模块。
即使它提供了您需要的所有功能,简约方法也不一定更好:例如:返回collections.OrderedDict
嵌套在其自身值中的repr()
时,OrderedDict
最初确实有bug。之前可能找到的一个错误是,子集,OrderedDict的小子集可以处理旧的ordereddict
的单元测试。