为什么Python词典不按创建顺序存储?

时间:2015-10-03 00:15:42

标签: python dictionary python-internals

最让人感到好奇的是,但为什么不像下面那样的字典没有按照它创建的那样排序?但是当我打印出test时,它会从那时起返回相同的顺序......

test = {'one':'1', 'two':'2', 'three':'3', 'four':'4'}

这不是我需要他们订购的,但是我已经想到了这里发生了什么。

我在此发现的唯一一件事就是引用了this文章:

Python使用复杂的算法来确定键值对在字典中的存储位置。

但是这些"复杂的算法是什么"为什么?

2 个答案:

答案 0 :(得分:4)

Python需要能够快速访问D[thing]

如果它按照接收它们的顺序存储值,那么当您向它请求D[thing]时,它不会事先知道它放置该值的位置。它必须找到键thing出现的位置,然后找到该值。由于它无法控制接收的顺序,因此平均需要N / 2步,其中N是接收到的密钥数。

但是如果相反它有一个函数(称为哈希)可以将thing转换到内存中的某个位置,它可以快速获取thing并计算该值,并检查该位置记忆。当然,它需要做更多的开销 - 检查D[thing]是否已经实际定义,并检查那些罕见的情况,你可能已经定义了D[thing1]D[thing2]其中的散列函数thing1thing2碰巧是相同的(在这种情况下发生“碰撞”,python必须找出一个新的位置来放置其中一个)。

因此,对于您的示例,您可能希望在搜索test['four']时,它只会转到列表中的最后一个条目并显示“aha,即'4'”。但它不能做到这一点。它是如何知道four对应于列表的最后一个条目的。它可能以任何顺序出现,因此它必须创建一些其他数据结构,以便快速告知four是最后一个条目。这将花费大量开销。

可以按照输入的顺序输出内容,但这仍然需要额外的开销来跟踪输入内容的顺序。

答案 1 :(得分:0)

为了好奇,如果你想要一个有序的字典,请使用OrderedDict