一、字典的实现

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, vin 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 ,如需转载请自行联系原作者

【Python】12、字典的实现相关推荐

  1. python嵌套字典取值_python嵌套字典比较值与取值的实现示例

    python嵌套字典比较值与取值的实现示例 本文通过示例给大家介绍了python嵌套字典比较值,取值,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 示例代码 #取值import t ...

  2. Python_Tips[1] - 利用 Python 的字典实现 Switch 功能

    利用 Python 的字典实现 Switch 功能 Python是没有switch语句的,当遇到需要实现switch语句的功能时,一般可以用if/else进行代替,但是还有一种更加简洁的实现方法,利用 ...

  3. python中可以作为定界符_在 Python 中,字典和集合都是用一对 作为定界符,字典的每个元素有两部分组成,即 和 ,其中 不允许重复。_学小易找答案...

    [多选题]路由器A的G0/0/1接口配置信息如下,下列说法正确的有?(多选) acl number 3000 rule 5 deny 17 rule 10 deny 89 rule 15 deny 6 ...

  4. python处理字典的方法_python字典的常用操作方法小结

    Python字典是另一种可变容器模型(无序),且可存储任意类型对象,如字符串.数字.元组等其他容器模型.本文章主要介绍Python中字典(Dict)的详解操作方法,包含创建.访问.删除.其它操作等,需 ...

  5. python 存储字典_python 字典存储

    Python学习笔记--元组.列表和字典的使用笔记 Python学习笔记--元组.列表和字典的使用笔记 最近开始学习python语言,所以在学习中做了一些记录,这次讲的是元组.列表和字典的基础操作和区 ...

  6. Python之字典(定义、方法、例题)

    文章目录 写在开头的话 Python之字典 00. 概述 字典dict定义. 初始化 01. 字典元素的访问 02. 字典增加和修改 03. 字典删除 04. 字典遍历和移除 05. 字典的key 0 ...

  7. Python 将字典(dict)转换为DataFrame

    Python 将字典(dict)转换为DataFrame 1.将字典转换为 Pandas DataFame 的方法 Pandas 的 DataFrame 构造函数pd.DataFrame()如果将字典 ...

  8. python中字典列表元组_Python中的列表和元组

    python中字典列表元组 Lists and tuples are arguably Python's most versatile, useful data types. You will fin ...

  9. python复制字典_python字典复制

    python学习系列--深拷贝和浅拷贝 概念 普通情况下,复制一个对象是不会新开辟内存空间的,只是把新的对象名称指向原有的内存地址,这种操作其实不是算是拷贝,只是新的引用.把新的对象置于新的内存空间中 ...

  10. python取出字典的某个键_python 取出字典的键或者值/如何删除一个字典的键值对/如何遍历字典...

    先定义一个字典并直接进行初始化赋值 my_dict = dict(name="lowman", age=45, money=998, hourse=None) 1.取出该字典所有的 ...

最新文章

  1. 刚刚!2020“中国高被引学者” 榜单发布:清华、北大、浙大位居内地前三!...
  2. 如何删除计算机桌面多余的大e,桌面有个大E浏览器图标,怎么也删除不了
  3. 查看HTML代码却被当黑客,记者好心报告漏洞,反遭美国州长起诉
  4. 计算机基础教育学,计算机基础教育教学改革与创新
  5. Teradata应用迁移到AnalyticDB for PostgreSQL指导
  6. 心理软件测试自学,软件测试中的心理学
  7. 你们网贷逾期最长多少时间,你们怎么处理的
  8. python樱桃小丸子_appium+python自动化框架搭建
  9. 【iOS之轮播视图、自定义UIPageControl】
  10. anaconda 虚拟环境
  11. CPT205-Computer Graphics
  12. java quartz配置
  13. latex符号正下方下标
  14. Dreammail 下载与安装
  15. 编译原理学习笔记之上下文无关文法
  16. 震惊!你可能下了个假的抢红包神器
  17. android 控件阴影
  18. GitHub设置代理 提升速度
  19. 中国商贸物流行业运行状况分析及投资规模预测报告2021-2027年
  20. 51单片机基础理论知识(会补充)

热门文章

  1. Unicode转义(\uXXXX)的编码和解码
  2. Spring Bean四种注入方式(Springboot环境)
  3. C#表达式,类型和变量
  4. 利用WebClient和WebRequest类获得网页源代码C#
  5. 通过配置NFS使Ubuntu和海思3559A板子共享目录
  6. Linux Socket基础介绍
  7. Windows7在Eclipse中配置Python+OpenCV
  8. java axis2 开发_基于Apache axis2开发Java Web服务
  9. Java项目:健身器材商城系统(java+Jdbc+Servlet+Ajax+Fileupload+mysql)
  10. Java项目:控制台商城系统(java+打印控制台)