为什么 Python 词典没有按创建顺序存储?
Why are Python dictionaries NOT stored in the order they were created?
只是好奇胜过其他任何东西,但为什么像下面这样的字典的顺序与创建时的顺序不同?但是当我打印出 test
它 returns 从那时起相同的顺序...
test = {'one':'1', 'two':'2', 'three':'3', 'four':'4'}
并不是说我需要订购它们,而是我一直在想这里发生的事情。
我在此找到的唯一内容是引用自 this 文章:
Python 使用复杂的算法来确定键值对在字典中的存储位置。
但是这些 "complex algorithms" 是什么?为什么?
Python 需要能够快速访问 D[thing]
。
如果它按照接收到的顺序存储值,那么当您向它请求 D[thing]
时,它事先并不知道该值放在哪里。它必须找到键 thing
出现的位置,然后找到该值。由于它无法控制接收这些密钥的顺序,因此平均需要大约 N/2 步,其中 N 是它收到的密钥数。
但是如果它有一个函数(称为散列)可以将 thing
转换为内存中的某个位置,它可以快速获取 thing
并计算该值,然后签入该值记忆点。当然,它必须做更多的开销——检查 D[thing]
是否确实被定义,并检查那些你可能定义了 D[thing1]
和 D[thing2]
的罕见情况,其中散列函数thing1
和 thing2
碰巧是相同的(在这种情况下 "collision" 出现并且 python 必须找出一个新的地方来放置其中之一)。
因此,对于您的示例,您可能希望当您搜索 test['four']
时,它只会转到存储的列表中的最后一个条目并显示 "aha, that's '4'
." 但它不能只这样做.它怎么知道 four
对应于列表的最后一个条目。它可能以任何顺序出现,因此它必须创建一些其他数据结构,使其能够快速判断 four
是最后一个条目。这会花费很多开销。
可以让它按照输入的顺序输出内容,但这仍然需要额外的开销来跟踪输入的顺序。
出于好奇,如果你想要一个有序的字典,使用OrderedDict
只是好奇胜过其他任何东西,但为什么像下面这样的字典的顺序与创建时的顺序不同?但是当我打印出 test
它 returns 从那时起相同的顺序...
test = {'one':'1', 'two':'2', 'three':'3', 'four':'4'}
并不是说我需要订购它们,而是我一直在想这里发生的事情。
我在此找到的唯一内容是引用自 this 文章:
Python 使用复杂的算法来确定键值对在字典中的存储位置。
但是这些 "complex algorithms" 是什么?为什么?
Python 需要能够快速访问 D[thing]
。
如果它按照接收到的顺序存储值,那么当您向它请求 D[thing]
时,它事先并不知道该值放在哪里。它必须找到键 thing
出现的位置,然后找到该值。由于它无法控制接收这些密钥的顺序,因此平均需要大约 N/2 步,其中 N 是它收到的密钥数。
但是如果它有一个函数(称为散列)可以将 thing
转换为内存中的某个位置,它可以快速获取 thing
并计算该值,然后签入该值记忆点。当然,它必须做更多的开销——检查 D[thing]
是否确实被定义,并检查那些你可能定义了 D[thing1]
和 D[thing2]
的罕见情况,其中散列函数thing1
和 thing2
碰巧是相同的(在这种情况下 "collision" 出现并且 python 必须找出一个新的地方来放置其中之一)。
因此,对于您的示例,您可能希望当您搜索 test['four']
时,它只会转到存储的列表中的最后一个条目并显示 "aha, that's '4'
." 但它不能只这样做.它怎么知道 four
对应于列表的最后一个条目。它可能以任何顺序出现,因此它必须创建一些其他数据结构,使其能够快速判断 four
是最后一个条目。这会花费很多开销。
可以让它按照输入的顺序输出内容,但这仍然需要额外的开销来跟踪输入的顺序。
出于好奇,如果你想要一个有序的字典,使用OrderedDict