键是数字时的字典顺序

时间:2014-02-26 22:55:50

标签: python dictionary

我们知道常规Python词典是无序的,但是当键是自然数字集的情况呢?当域是自然数的集合时,hash函数似乎是一个身份函数,并且迭代x = {0:'a', 1:'b', 2:'c'}之类的东西似乎产生了密钥的自然顺序,即0,1,2。

这种行为可以依赖吗?

(是的,我知道OrderedDict)

编辑:

这是我的具体用法,或者至少这可以捕捉到我所看到的精神。

x = dict((a, chr(a)) for a in range(10))

for i in x: print i

这似乎保留了秩序。

3 个答案:

答案 0 :(得分:6)

不。永远不要依赖字典键的顺序。一个说明性的例子:

>>> {0: 1, 8: 2}
{0: 1, 8: 2}
>>> {8: 1, 0: 2}
{8: 1, 0: 2}

这是因为字典以8个桶开始。因此,0和8最终在同一个桶中,这将导致立即冲突。顺序取决于首先插入的顺序。 (但不要依赖于那个:初始大小不是保证!)

但是,你是正确的hash int(在Python 2.x中)是身份函数(唯一的例外是-1,它被映射到-2以避免与通常的“错误返回”值发生冲突)。但是,intlong之间的区别有时非常微妙,long使用不同的哈希算法(因为它们可以任意大)。

答案 1 :(得分:0)

不,你不能依赖这种行为。这是一个实现细节,可以从一个版本的Python更改为下一个版本,甚至从一个系统更改为下一个系统。

话虽如此,但不太可能很快改变。

答案 2 :(得分:0)

没有。订单还取决于密钥的插入顺序。