前言
字典也叫散列表,最大的特点是通过key来查找其对应的值其时间复杂度是O(1),下面这篇文章就来给大家介绍介绍python利用拉链法实现字典的方法。
在Python中怎样用列表实现字典?
用列表实现字典最大的问题就是解决hash冲突,如果在列表中通过计算不同的key得到相同的相同了位置,这时候应该怎么办?
最简单的办法就是使用拉链法.
拉链法:就是在一个列表中每个位置再添加一个列表,这样就算是有hash冲突也能够存储进去,当选取的hash函数足够好,
num的数足够大,就能够保证列表中的每一个列表里面只有一个元素。根据key计算的元素所在的位置,然后来取值就能达
到O(1)的时间。
方法示例
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
|
class MyDict:
def __init__( self , num = 100 ): # 指定列表大小
self ._num = num
self ._lst = []
for _ in range ( self ._num):
self ._lst.append([])
def update( self , key, value): # 添加 key-value
key_index = hash (key) % self ._num
for i, (k, v) in enumerate ( self ._lst[key_index]):
if key = = k:
self ._lst[key_index][i] = [key, value]
break
else :
self ._lst[key_index].append([key, value])
def get( self , key): # 根据指定的 key 弹出值
key_index = hash (key) % self ._num
for k, v in self ._lst[key_index]:
if k = = key:
return v
else :
raise KeyError( 'No such {} key' . format (key))
def pop( self , key): # 根据 key 弹出元素 并且删除
key_index = hash (key) % self ._num
for i, (k, v) in enumerate ( self ._lst[key_index]):
if k = = key:
result = v
self ._lst.pop(i)
return result
else :
raise KeyError( 'No such {} key' . format (key))
def __getitem__( self , key): # 可以通过下标来取值
key_index = hash (key) % self ._num
for k, v in self ._lst[key_index]:
if k = = key:
return v
else :
raise KeyError( 'No such {} key' . format (key))
def keys( self ): # 取得所有的key
for index in range ( self ._num):
for k, v in self ._lst[index]:
yield k
def values( self ): # 取得所有的 value
for index in range ( self ._num):
for k, v in self ._lst[index]:
yield v
def items( self ): # 取得所有的条目
for index in range ( self ._num):
for item in self ._lst[index]:
yield item
|
通过key查到的时间,可见下图
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对服务器之家的支持。