最让人感到好奇的是,但为什么不像下面那样的字典没有按照它创建的那样排序?但是当我打印出test
时,它会从那时起返回相同的顺序......
test = {'one':'1', 'two':'2', 'three':'3', 'four':'4'}
这不是我需要他们订购的,但是我已经想到了这里发生了什么。
我在此发现的唯一一件事就是引用了this文章:
Python使用复杂的算法来确定键值对在字典中的存储位置。
但是这些"复杂的算法是什么"为什么?
答案 0 :(得分:4)
Python需要能够快速访问D[thing]
。
如果它按照接收它们的顺序存储值,那么当您向它请求D[thing]
时,它不会事先知道它放置该值的位置。它必须找到键thing
出现的位置,然后找到该值。由于它无法控制接收的顺序,因此平均需要N / 2步,其中N是接收到的密钥数。
但是如果相反它有一个函数(称为哈希)可以将thing
转换到内存中的某个位置,它可以快速获取thing
并计算该值,并检查该位置记忆。当然,它需要做更多的开销 - 检查D[thing]
是否已经实际定义,并检查那些罕见的情况,你可能已经定义了D[thing1]
和D[thing2]
其中的散列函数thing1
和thing2
碰巧是相同的(在这种情况下发生“碰撞”,python必须找出一个新的位置来放置其中一个)。
因此,对于您的示例,您可能希望在搜索test['four']
时,它只会转到列表中的最后一个条目并显示“aha,即'4'
”。但它不能做到这一点。它是如何知道four
对应于列表的最后一个条目的。它可能以任何顺序出现,因此它必须创建一些其他数据结构,以便快速告知four
是最后一个条目。这将花费大量开销。
可以按照输入的顺序输出内容,但这仍然需要额外的开销来跟踪输入内容的顺序。
答案 1 :(得分:0)
为了好奇,如果你想要一个有序的字典,请使用OrderedDict