作者:红星闪闪小肉肉 | 来源:互联网 | 2017-05-14 02:44
这篇文章主要介绍了python利用拉链法实现字典的方法,文中给出了详细的示例代码,相信对大家具有一定的参考价值,需要的朋友可以们下面来一起看看吧。
前言
字典也叫散列表,最大的特点是通过key来查找其对应的值其时间复杂度是O(1),下面这篇文章就来给大家介绍介绍python利用拉链法实现字典的方法。
在Python中怎样用列表实现字典?
用列表实现字典最大的问题就是解决hash冲突,如果在列表中通过计算不同的key得到相同的相同了位置,这时候应该怎么办?
最简单的办法就是使用拉链法.
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查到的时间,可见下图
以上就是详解python利用拉链法实现字典方法示例代码的详细内容,更多请关注 第一PHP社区 其它相关文章!