【Python】12、字典的实现

简介:

一、字典的实现

dic 可以使用list来实现 

i(索引) = hash(key) % solt(槽位数)

此时i重复了怎么办(hash冲突)?


1、拉链法

 每个槽位上拉一个List,就是拉链法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
In [6]: solts = []         # 初始化一个list
 
In [7]: solts_num = 32     # 假设32个槽位
 
In [8]:  for  in  range(solts_num):
    ...:     solts.append([])
    ...:     
 
In [9]: solts             # 每个槽位上都是一个list
Out[9]: 
[[],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  []]
  
 
## 定义dict的put方法 
 
In [10]: def put(solts, key, value):
     ...:     i =  hash (key) % solts_num
     ...:     solts[i].append((key, value))
     ...:     
 
     
## 定义dict的get方法
 
In [12]: def get(solts, key):
     ...:     i =  hash (key) % solts_num
     ...:      for  k,  v  in  solts[i]:
     ...:          if  k == key:
     ...:              return  v
     ...:     raise KeyError(key)
     ...: 
     
     
## 测试
 
In [23]: put(solts,  'a' , 1)
 
In [24]: solts
Out[24]: 
[[( 'a' , 1)],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  []]
 
In [25]: put(solts,  'b' , 2)
 
In [26]: put(solts,  'f' , 9)
 
In [27]: solts
Out[27]: 
[[( 'a' , 1)],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [( 'f' , 9)],
  [],
  [( 'b' , 2)],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  []]
 
 
 
In [28]: get(solts,  'b' )
Out[28]: 2
 
In [29]: get(solts,  'f' )
Out[29]: 9
 
In [107]: get(solts,  'x' )
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-107-bdc41302b4b3>  in  <module>()
----> 1 get(solts,  'x' )
 
<ipython-input-100-31c1edecb2ae>  in  get(solts, key)
       4          if  k == key:
       5              return  v
----> 6     raise KeyError(key)
      
 
KeyError:  'x'

 

此时put一个已存在的key时:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
In [33]: put(solts,  'a' , 11)
 
In [34]: solts
Out[34]: 
[[( 'a' , 1), ( 'a' , 11)],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [( 'f' , 9)],
  [],
  [( 'b' , 2)],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  []]
  
In [35]: get(solts,  'a' )
Out[35]: 1


重新定put方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
In [87]: def put(solts, key, value):
     ...:     i =  hash (key) % solts_num
     ...:      for  p, (k,  v in  enumerate(solts[i]):
     ...:          if  k == key:
     ...:             solts[i][p] = (key, value)
     ...:      else :
     ...:         solts[i].append((key, value))
     
     
In [89]: solts
Out[89]: []
 
In [90]:  for  in  range(solts_num):
     ...:     solts.append([])
     ...:     
 
 
In [92]: put(solts,  'a' , 1)
 
In [94]: put(solts,  'b' , 2)
 
In [95]: put(solts,  'f' , 8)
 
In [96]: solts
Out[96]: 
[[( 'a' , 1)],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [( 'f' , 8)],
  [],
  [( 'b' , 2)],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  []]
  
  
In [101]: get(solts,  'b' )
Out[101]: 2
 
In [102]: get(solts,  'f' )
Out[102]: 8
 
In [103]: get(solts,  'a' )
Out[103]: 11
 
In [104]: put(solts,  'b' , 22)
 
In [105]: get(solts,  'b' )
Out[105]: 22
 
In [106]: solts
Out[106]: 
[[( 'a' , 11), ( 'a' , 11)],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [( 'f' , 8)],
  [],
  [( 'b' , 22), ( 'b' , 22)],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  [],
  []]
 
In [107]: get(solts,  'x' )
---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-107-bdc41302b4b3>  in  <module>()
----> 1 get(solts,  'x' )
 
<ipython-input-100-31c1edecb2ae>  in  get (solts, key)
       4          if  k == key:
       5              return  v
----> 6     raise KeyError(key)
      
 
KeyError:  'x'

    set在底层的实现就是一个忽略了value的dict


2、开地址法

  使用某个算法重新计算i,就交开地址法

  常用,效率更高,

i = fn(key, i)


待后续学习
























本文转自xiexiaojun51CTO博客,原文链接:http://blog.51cto.com/xiexiaojun/1933230 ,如需转载请自行联系原作者



相关文章
|
4月前
|
存储 JavaScript Java
(Python基础)新时代语言!一起学习Python吧!(四):dict字典和set类型;切片类型、列表生成式;map和reduce迭代器;filter过滤函数、sorted排序函数;lambda函数
dict字典 Python内置了字典:dict的支持,dict全称dictionary,在其他语言中也称为map,使用键-值(key-value)存储,具有极快的查找速度。 我们可以通过声明JS对象一样的方式声明dict
343 1
|
5月前
|
存储 JSON 数据管理
Python字典:高效数据管理的瑞士军刀
Python字典基于哈希表实现,提供接近O(1)的高效查找,支持增删改查、遍历、合并等丰富操作,广泛应用于计数、缓存、配置管理及JSON处理。其灵活性与性能使其成为数据处理的核心工具。
617 0
|
5月前
|
存储 缓存 安全
Python字典:从入门到精通的实用指南
Python字典如瑞士军刀般强大,以键值对实现高效数据存储与查找,广泛应用于配置管理、缓存、统计等场景。本文详解字典基础、进阶技巧、实战应用与常见陷阱,助你掌握这一核心数据结构,写出更高效、优雅的Python代码。
149 0
|
11月前
|
存储 人工智能 索引
Python数据结构:列表、元组、字典、集合
Python 中的列表、元组、字典和集合是常用数据结构。列表(List)是有序可变集合,支持增删改查操作;元组(Tuple)与列表类似但不可变,适合存储固定数据;字典(Dictionary)以键值对形式存储,无序可变,便于快速查找和修改;集合(Set)为无序不重复集合,支持高效集合运算如并集、交集等。根据需求选择合适的数据结构,可提升代码效率与可读性。
|
JSON 监控 安全
深入理解 Python 的 eval() 函数与空全局字典 {}
`eval()` 函数在 Python 中能将字符串解析为代码并执行,但伴随安全风险,尤其在处理不受信任的输入时。传递空全局字典 {} 可限制其访问内置对象,但仍存隐患。建议通过限制函数和变量、使用沙箱环境、避免复杂表达式、验证输入等提高安全性。更推荐使用 `ast.literal_eval()`、自定义解析器或 JSON 解析等替代方案,以确保代码安全性和可靠性。
594 2
|
XML JSON API
如何使用Python将字典转换为XML
本文介绍了如何使用Python中的`xml.etree.ElementTree`库将字典数据结构转换为XML格式。通过定义递归函数处理字典到XML元素的转换,生成符合标准的XML文档,适用于与旧系统交互或需支持复杂文档结构的场景。示例代码展示了将一个简单字典转换为XML的具体实现过程。
295 1
|
存储 JSON 索引
一文让你彻底搞懂 Python 字典是怎么实现的
一文让你彻底搞懂 Python 字典是怎么实现的
639 13
|
存储 Java Serverless
【Python】字典
【Python】字典
165 1
|
存储 数据安全/隐私保护 Python
Python常用数据结构——字典的应用
Python常用数据结构——字典的应用
279 2
|
Python
Python 字典删除下标前两个
Python 字典删除下标前两个
169 1

推荐镜像

更多