如果未修改,dicts是否保留迭代顺序?

时间:2009-12-04 20:03:08

标签: python algorithm dictionary hash

如果我在Python中有一个字典,并且我迭代了一次,然后再次迭代,是否保证迭代顺序保留,因为我没有插入,删除或更新字典中的任何项目? (但我可能已经做过查找)。

7 个答案:

答案 0 :(得分:31)

以下是dict.items() documentation所说的内容:

  

dict.items()返回字典的(键,值)对列表的副本。

     

如果调用items(),keys(),values(),iteritems(),iterkeys()和itervalues()而没有对字典进行干预修改,则列表将直接对应。

我认为如果您所做的只是迭代,那么假设项目排序不会改变是合理的。

答案 1 :(得分:12)

标准Python dict与大多数实现一样,不会保留排序,因为通常使用密钥访问项目。

然而,可预测的迭代有时是有用的,并且在Python 3.1中,collections模块包含一个OrderedDict,它保留了订单,但性能开销最小。

答案 2 :(得分:5)

是。没有涉及随机化。还有一个更强大的保证 - 见here

答案 3 :(得分:4)

除了Python 3.1之外,

collections.OrderedDict将在Python 2.7中提供。

对于2.7之前的Python版本,PyPI上有collective.ordereddict,Django有自己的SortedDict实现。

答案 4 :(得分:2)

Python字典没有顺序概念。所以你在迭代时不能依赖特定的顺序。

这是故意的:因为它是一个哈希映射,如果你想要'快速查找',这是不可避免的!

答案 5 :(得分:2)

它可能会在某些实现中保留,但不要指望它,因为它不是Dict规范的一部分。

答案 6 :(得分:1)

正如Christophe所说,字典用于组织键/值对,因为它提供了快速的访问时间。如果应用程序需要固定索引,则应查看提供特定/已知顺序的其他数据结构。

话虽如此,应该可以安全地假设订单不会改变,除非添加了项目(没有任何意义可以进行这种昂贵的重组操作)但是,再次,不要依赖在它上面。