Python字典插入和删除

2024-06-17 09:52:52 发布

您现在位置:Python中文网/ 问答频道 /正文

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的值是多少,它总是插入到第二位。 提前谢谢


Tags: keyinreforvalue记录itemspop
3条回答

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中的字典是无序的——因为字典中的值是由键索引的,所以它们不按任何特定顺序保存

相关问题 更多 >