Python中的词典如何不编制索引?

Python中的词典如何不编制索引?,python,dictionary,Python,Dictionary,我的印象是字典没有索引。但当在两个字典上使用zip()时,它返回的结果指向其他地方。 例如: d1={'a'=1,'b'=2} d2={'c'=1,'d'=2} >>> import string >>> d1 = {} >>> for letter in string.ascii_lowercase: ... d1[letter] = 1 ... >>> d2 = {} >>> for let

我的印象是字典没有索引。但当在两个字典上使用
zip()
时,它返回的结果指向其他地方。 例如:

d1={'a'=1,'b'=2}
d2={'c'=1,'d'=2}
>>> import string
>>> d1 = {}
>>> for letter in string.ascii_lowercase:
...     d1[letter] = 1
... 
>>> d2 = {}
>>> for letter in reversed(string.ascii_lowercase):
...     d2[letter] = 1
... 
>>> d1 == d2
True
>>> print(list(d1), list(d2), list(zip(d1, d2)), sep='\n')
['u', 'f', 'm', 'x', 'n', 'k', 'q', 't', 'e', 'r', 'j', 'd', 'o', 'b', 'g', 'c', 'z', 'v', 'y', 'a', 'i', 'l', 's', 'p', 'w', 'h']
['u', 'f', 'm', 'x', 'n', 'k', 't', 's', 'q', 'j', 'd', 'e', 'o', 'b', 'g', 'c', 'z', 'v', 'y', 'a', 'i', 'l', 'p', 'h', 'w', 'r']
[('u', 'u'), ('f', 'f'), ('m', 'm'), ('x', 'x'), ('n', 'n'), ('k', 'k'), ('q', 't'), ('t', 's'), ('e', 'q'), ('r', 'j'), ('j', 'd'), ('d', 'e'), ('o', 'o'), ('b', 'b'), ('g', 'g'), ('c', 'c'), ('z', 'z'), ('v', 'v'), ('y', 'y'), ('a', 'a'), ('i', 'i'), ('l', 'l'), ('s', 'p'), ('p', 'h'), ('w', 'w'), ('h', 'r')]
Python2中的zip(d1,d2)将始终返回

[('a', 'c'),('b', 'd')]

有人能解释一下列表的索引和存储吗?

字典是使用哈希表实现的。所有这些数据结构都不能保证键的顺序。例如:

d1={'a'=1,'b'=2}
d2={'c'=1,'d'=2}
>>> import string
>>> d1 = {}
>>> for letter in string.ascii_lowercase:
...     d1[letter] = 1
... 
>>> d2 = {}
>>> for letter in reversed(string.ascii_lowercase):
...     d2[letter] = 1
... 
>>> d1 == d2
True
>>> print(list(d1), list(d2), list(zip(d1, d2)), sep='\n')
['u', 'f', 'm', 'x', 'n', 'k', 'q', 't', 'e', 'r', 'j', 'd', 'o', 'b', 'g', 'c', 'z', 'v', 'y', 'a', 'i', 'l', 's', 'p', 'w', 'h']
['u', 'f', 'm', 'x', 'n', 'k', 't', 's', 'q', 'j', 'd', 'e', 'o', 'b', 'g', 'c', 'z', 'v', 'y', 'a', 'i', 'l', 'p', 'h', 'w', 'r']
[('u', 'u'), ('f', 'f'), ('m', 'm'), ('x', 'x'), ('n', 'n'), ('k', 'k'), ('q', 't'), ('t', 's'), ('e', 'q'), ('r', 'j'), ('j', 'd'), ('d', 'e'), ('o', 'o'), ('b', 'b'), ('g', 'g'), ('c', 'c'), ('z', 'z'), ('v', 'v'), ('y', 'y'), ('a', 'a'), ('i', 'i'), ('l', 'l'), ('s', 'p'), ('p', 'h'), ('w', 'w'), ('h', 'r')]
请注意并非所有键都匹配

顺序取决于词典的历史。我相信默认情况下,python创建的对象可以存储8个项目,之后表的大小必须增加,元素必须移动,从而改变顺序。所以,如果您使用非常小的字典和键,而这些键不会导致冲突,那么您最终会得到一致的顺序,但这都是一个实现细节

无论何时添加/删除一些项目,您都会看到订单出现分歧


要给出订单更改的示例,请参见:

>>> d3 = {}
>>> for letter in string.ascii_lowercase:
...     d3[letter] = 1
...     print(list(d3))
... 
['a']
['a', 'b']
['a', 'b', 'c']
['a', 'b', 'c', 'd']
['a', 'b', 'e', 'c', 'd']
['a', 'b', 'e', 'd', 'c', 'f']
['a', 'b', 'g', 'e', 'd', 'c', 'f']
['a', 'b', 'g', 'e', 'd', 'c', 'f', 'h']
['a', 'b', 'g', 'e', 'i', 'd', 'c', 'f', 'h']
['a', 'b', 'g', 'e', 'i', 'd', 'c', 'j', 'f', 'h']
['a', 'b', 'g', 'e', 'i', 'd', 'c', 'j', 'f', 'k', 'h']
['b', 'g', 'c', 'f', 'k', 'a', 'i', 'e', 'j', 'l', 'd', 'h']
['b', 'g', 'c', 'f', 'm', 'k', 'a', 'i', 'e', 'j', 'l', 'd', 'h']
['b', 'g', 'c', 'f', 'm', 'n', 'k', 'a', 'i', 'e', 'j', 'l', 'd', 'h']
['b', 'g', 'c', 'f', 'm', 'n', 'k', 'a', 'i', 'e', 'j', 'l', 'd', 'o', 'h']
['b', 'g', 'c', 'f', 'm', 'n', 'k', 'a', 'i', 'e', 'j', 'l', 'd', 'p', 'o', 'h']
['b', 'g', 'c', 'f', 'm', 'n', 'k', 'a', 'i', 'e', 'q', 'j', 'l', 'd', 'p', 'o', 'h']
['b', 'g', 'c', 'f', 'm', 'n', 'k', 'a', 'i', 'e', 'r', 'q', 'j', 'l', 'd', 'p', 'o', 'h']
['b', 'g', 'c', 'f', 'm', 'n', 'k', 'a', 'i', 'e', 'r', 'q', 'j', 'l', 'd', 'p', 's', 'o', 'h']
['b', 'g', 'c', 'f', 'm', 'n', 'k', 'a', 'i', 't', 'e', 'r', 'q', 'j', 'l', 'd', 'p', 's', 'o', 'h']
['b', 'g', 'c', 'f', 'm', 'u', 'n', 'k', 'a', 'i', 't', 'e', 'r', 'q', 'j', 'l', 'd', 'p', 's', 'o', 'h']
['u', 'f', 'm', 'n', 'k', 'q', 't', 'e', 'r', 'j', 'd', 'o', 'b', 'g', 'c', 'v', 'a', 'i', 'l', 's', 'p', 'h']
['u', 'f', 'm', 'n', 'k', 'q', 't', 'e', 'r', 'j', 'd', 'o', 'b', 'g', 'c', 'v', 'a', 'i', 'l', 's', 'p', 'w', 'h']
['u', 'f', 'm', 'x', 'n', 'k', 'q', 't', 'e', 'r', 'j', 'd', 'o', 'b', 'g', 'c', 'v', 'a', 'i', 'l', 's', 'p', 'w', 'h']
['u', 'f', 'm', 'x', 'n', 'k', 'q', 't', 'e', 'r', 'j', 'd', 'o', 'b', 'g', 'c', 'v', 'y', 'a', 'i', 'l', 's', 'p', 'w', 'h']
['u', 'f', 'm', 'x', 'n', 'k', 'q', 't', 'e', 'r', 'j', 'd', 'o', 'b', 'g', 'c', 'z', 'v', 'y', 'a', 'i', 'l', 's', 'p', 'w', 'h']

正如您从
['a',b',e',c',d']
中看到的,通过添加
f
将顺序更改为
['a',b',e',d',c',f']
,请参见
c
d
是如何交换的?以此类推。对于所有其他字母,直到您在开头以
u
结尾。

字典是使用哈希表实现的。所有这些数据结构都不能保证键的顺序。例如:

d1={'a'=1,'b'=2}
d2={'c'=1,'d'=2}
>>> import string
>>> d1 = {}
>>> for letter in string.ascii_lowercase:
...     d1[letter] = 1
... 
>>> d2 = {}
>>> for letter in reversed(string.ascii_lowercase):
...     d2[letter] = 1
... 
>>> d1 == d2
True
>>> print(list(d1), list(d2), list(zip(d1, d2)), sep='\n')
['u', 'f', 'm', 'x', 'n', 'k', 'q', 't', 'e', 'r', 'j', 'd', 'o', 'b', 'g', 'c', 'z', 'v', 'y', 'a', 'i', 'l', 's', 'p', 'w', 'h']
['u', 'f', 'm', 'x', 'n', 'k', 't', 's', 'q', 'j', 'd', 'e', 'o', 'b', 'g', 'c', 'z', 'v', 'y', 'a', 'i', 'l', 'p', 'h', 'w', 'r']
[('u', 'u'), ('f', 'f'), ('m', 'm'), ('x', 'x'), ('n', 'n'), ('k', 'k'), ('q', 't'), ('t', 's'), ('e', 'q'), ('r', 'j'), ('j', 'd'), ('d', 'e'), ('o', 'o'), ('b', 'b'), ('g', 'g'), ('c', 'c'), ('z', 'z'), ('v', 'v'), ('y', 'y'), ('a', 'a'), ('i', 'i'), ('l', 'l'), ('s', 'p'), ('p', 'h'), ('w', 'w'), ('h', 'r')]
请注意并非所有键都匹配

顺序取决于词典的历史。我相信默认情况下,python创建的对象可以存储8个项目,之后表的大小必须增加,元素必须移动,从而改变顺序。所以,如果您使用非常小的字典和键,而这些键不会导致冲突,那么您最终会得到一致的顺序,但这都是一个实现细节

无论何时添加/删除一些项目,您都会看到订单出现分歧


要给出订单更改的示例,请参见:

>>> d3 = {}
>>> for letter in string.ascii_lowercase:
...     d3[letter] = 1
...     print(list(d3))
... 
['a']
['a', 'b']
['a', 'b', 'c']
['a', 'b', 'c', 'd']
['a', 'b', 'e', 'c', 'd']
['a', 'b', 'e', 'd', 'c', 'f']
['a', 'b', 'g', 'e', 'd', 'c', 'f']
['a', 'b', 'g', 'e', 'd', 'c', 'f', 'h']
['a', 'b', 'g', 'e', 'i', 'd', 'c', 'f', 'h']
['a', 'b', 'g', 'e', 'i', 'd', 'c', 'j', 'f', 'h']
['a', 'b', 'g', 'e', 'i', 'd', 'c', 'j', 'f', 'k', 'h']
['b', 'g', 'c', 'f', 'k', 'a', 'i', 'e', 'j', 'l', 'd', 'h']
['b', 'g', 'c', 'f', 'm', 'k', 'a', 'i', 'e', 'j', 'l', 'd', 'h']
['b', 'g', 'c', 'f', 'm', 'n', 'k', 'a', 'i', 'e', 'j', 'l', 'd', 'h']
['b', 'g', 'c', 'f', 'm', 'n', 'k', 'a', 'i', 'e', 'j', 'l', 'd', 'o', 'h']
['b', 'g', 'c', 'f', 'm', 'n', 'k', 'a', 'i', 'e', 'j', 'l', 'd', 'p', 'o', 'h']
['b', 'g', 'c', 'f', 'm', 'n', 'k', 'a', 'i', 'e', 'q', 'j', 'l', 'd', 'p', 'o', 'h']
['b', 'g', 'c', 'f', 'm', 'n', 'k', 'a', 'i', 'e', 'r', 'q', 'j', 'l', 'd', 'p', 'o', 'h']
['b', 'g', 'c', 'f', 'm', 'n', 'k', 'a', 'i', 'e', 'r', 'q', 'j', 'l', 'd', 'p', 's', 'o', 'h']
['b', 'g', 'c', 'f', 'm', 'n', 'k', 'a', 'i', 't', 'e', 'r', 'q', 'j', 'l', 'd', 'p', 's', 'o', 'h']
['b', 'g', 'c', 'f', 'm', 'u', 'n', 'k', 'a', 'i', 't', 'e', 'r', 'q', 'j', 'l', 'd', 'p', 's', 'o', 'h']
['u', 'f', 'm', 'n', 'k', 'q', 't', 'e', 'r', 'j', 'd', 'o', 'b', 'g', 'c', 'v', 'a', 'i', 'l', 's', 'p', 'h']
['u', 'f', 'm', 'n', 'k', 'q', 't', 'e', 'r', 'j', 'd', 'o', 'b', 'g', 'c', 'v', 'a', 'i', 'l', 's', 'p', 'w', 'h']
['u', 'f', 'm', 'x', 'n', 'k', 'q', 't', 'e', 'r', 'j', 'd', 'o', 'b', 'g', 'c', 'v', 'a', 'i', 'l', 's', 'p', 'w', 'h']
['u', 'f', 'm', 'x', 'n', 'k', 'q', 't', 'e', 'r', 'j', 'd', 'o', 'b', 'g', 'c', 'v', 'y', 'a', 'i', 'l', 's', 'p', 'w', 'h']
['u', 'f', 'm', 'x', 'n', 'k', 'q', 't', 'e', 'r', 'j', 'd', 'o', 'b', 'g', 'c', 'z', 'v', 'y', 'a', 'i', 'l', 's', 'p', 'w', 'h']

正如您从
['a',b',e',c',d']
中看到的,通过添加
f
将顺序更改为
['a',b',e',d',c',f']
,请参见
c
d
是如何交换的?以此类推。对于所有其他字母,直到开头出现
u

字典不排序。只需尝试使用不同的顺序在两个字典中添加相同的项,可能会删除并重新插入一些项,您将看到顺序发生了变化。字典没有顺序,也不一定可以索引(除非键是整数
0
-
n
),但它们是可编辑的(如您的示例所示,您迭代了这些键)。不清楚您会对其中的哪一部分感到惊讶。索引实际上是指排序吗?如果您问“哈希表是如何实现的”这是一个太宽泛的问题,你可以在谷歌上轻松搜索。PyCon talk探索Python dicts的内部结构。非常确定这是一个没有顺序的字典副本。只需尝试使用不同的顺序在两个字典中添加相同的项,可能会删除和重新插入一些项,你就会看到顺序发生变化。Dict保守派不是有序的,也不一定能被索引(除非键是整数
0
-
n
),但它们是可编辑的(正如您的示例所示,您迭代了键)。不清楚这其中的哪一部分让您感到惊讶。通过索引,您实际上是指排序吗?如果您问“哈希表是如何实现的?”这是一个太宽泛的问题,在谷歌上搜索非常容易。PyCon talk探索Python dicts的内部结构。很确定这是一个重复