print("Before deleting:\n")
od = {}
od['a'] = 1
od['b'] = 2
od['c'] = 3
od['d'] = 4
for key, value in od.items():
print(key, value)
print("\nAfter deleting:\n")
od.pop('c')
for key, value in od.items():
print(key, value)
print("\nAfter re-inserting:\n")
od['c'] = 3
for key, value in od.items():
print(key, value)
运行这个之后,我得到了
删除前:
('a', 1)
('c', 3)
('b', 2)
('d', 4)
删除后:
('a', 1)
('b', 2)
('d', 4)
重新插入后:
('a', 1)
('c', 3)
('b', 2)
('d', 4)
我的问题是为什么c
插入到第二位,而对于记录来说,不管c
的值是多少,它总是插入到第二位。
提前谢谢
Python字典是使用哈希表实现的。它是一个数组,其索引是通过对键使用哈希函数获得的
对于任何给定的键(假设它是一个字符串),它首先通过一个哈希函数,然后用(arr_size-1)屏蔽它。整个:hash_func('a')&;(arr_size-1)给出数组中键值对的索引
(k,v)------;指数(n=8)(k,v)
(a,1)h(‘a’)及;7-->;0(a,1)
(b,2)--h('b')&;7-->;1(b,2)
(c,1)--h('c')&;7-->;2(c,3)
这就是为什么键“c”的索引没有改变的原因
src
您实际上使用的是Python 2,而不是Python 3,您的
print
的输出证明了这一点print
是Python2上的一个语句(除非代码顶部包含from __future__ import print_function
),而不是函数调用(就像Py3上的语句,或者Py2上带有__future__
导入的语句),因此括号只是生成了一个tuple
,您可以打印它在Python 3.6之前,
dict
没有有用的排序(它与键的哈希有关,但冲突解决意味着排序可以更改,因为dict
是以不同的顺序构造的),但是重新插入给定的键通常会(不保证)将其放在同一个存储桶中,将其保持在相同的迭代位置如果您正在寻找插入顺序行为(希望
'c'
移到末尾),可以升级到Python 3.6+(3.7+需要保证,但所有现有的3.6解释器都将其作为实现细节),或者使用collections.OrderedDict
请注意,python中的字典是无序的——因为字典中的值是由键索引的,所以它们不按任何特定顺序保存
相关问题 更多 >
编程相关推荐