Skip to content

Commit d71b146

Browse files
committed
增加 2.11 字典实现代码
1 parent 68d8b0a commit d71b146

File tree

2 files changed

+125
-0
lines changed

2 files changed

+125
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
#!/usr/bin/env python
2+
# encoding: utf-8
3+
# @Time : 2019/4/24 6:52 AM
4+
5+
__author__ = 'Miracle'
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,120 @@
1+
#!/usr/bin/env python
2+
# encoding: utf-8
3+
# @Time : 2019/4/24 6:52 AM
4+
5+
__author__ = 'Miracle'
6+
7+
'''
8+
初始代码
9+
'''
10+
# 首先要有一个列表, 槽位, 需要初始化
11+
slots = []
12+
# 假设给他32个槽位数
13+
slots_num = 32
14+
15+
# 这个是用来初始化我们的槽位
16+
for _ in range(slots_num):
17+
slots.append([])
18+
19+
20+
# 我们的put方法, 就是把key put到value里面
21+
def put(slots, key, value):
22+
# 先得到它的索引, 就是我们的槽位数取模, 这样就得到了它的索引值了
23+
i = hash(key) % slots_num
24+
# 把它的k-v对通过远组的方式put进去
25+
slots[i].append((key, value))
26+
27+
28+
# get方法
29+
def get(slots, key):
30+
# 首先求出它的i, 还是hash取模
31+
i = hash(key) % slots_num
32+
# 得到之后呢, 对他进行循环
33+
for k, v in slots[i]:
34+
if k == key:
35+
return v
36+
# 最后没有取到呢, 就会抛出异常
37+
raise KeyError(k)
38+
39+
40+
'''
41+
被优化过的代码
42+
'''
43+
44+
slots = []
45+
slots_num = 32
46+
47+
for _ in range(slots_num):
48+
slots.append([])
49+
50+
51+
def put(slots, key, value):
52+
i = hash(key) % slots_num
53+
54+
# 现在我们不能再简单的append了, 需要判断下, 需要记录一下他的位置
55+
# 所以用enumerate, 还记得这个内置函数吗?
56+
# 这里就用到了解构,不记得的可以回看一下
57+
for p, (k, v) in enumerate(slots[i]):
58+
if k == key:
59+
break
60+
# 如果没有相同的, 才append
61+
else:
62+
slots[i].append((key, value))
63+
return
64+
65+
# 如果p>=0,说明某个槽位被占用了,因为0才是第一位,
66+
if p >= 0:
67+
slots[i][p] = (key, value)
68+
69+
70+
def get(slots, key):
71+
i = hash(key) % slots_num
72+
for k, v in slots[i]:
73+
if k == key:
74+
return v
75+
raise KeyError(k)
76+
77+
78+
'''
79+
至于类的写法, 大家有可能不知道怎么写的, 我们简单的看看
80+
'''
81+
82+
83+
class Dict:
84+
# 初始化需要一个num, 用来定义槽位数
85+
def __init__(self, num):
86+
self.__slots__ = []
87+
self.num = num
88+
# 这里又看到 _ 了吧, 在for循环里
89+
# 我们不需要这个num具体的每一个值吧, 我们只需要初始化列表
90+
for _ in range(num):
91+
self.__slots__.append([])
92+
93+
# 我们把上面的put和get直接搬下来就ok了, 然后稍作修改
94+
def put(self, key, value):
95+
# 需要修改几个地方
96+
# slots_num -> self.num
97+
# slots[i] -> self.__slots__[i]
98+
i = hash(key) % self.num
99+
for p, (k, v) in enumerate(self.__slots__[i]):
100+
if k == key:
101+
break
102+
else:
103+
self.__slots__[i].append((key, value))
104+
return
105+
self.__slots__[i][p] = (key, value)
106+
107+
def get(self, key):
108+
i = hash(key) % self.num
109+
for k, v in self.__slots__[i]:
110+
if k == key:
111+
return v
112+
raise KeyError(key)
113+
114+
# 所以我们只要多一个遍历函数就好了
115+
def keys(self):
116+
ret = []
117+
for slot in self.__slots__:
118+
for k, _ in slot:
119+
ret.append(k)
120+
return ret

0 commit comments

Comments
 (0)