python利用拉鏈法實現(xiàn)字典方法示例
前言
字典也叫散列表,最大的特點是通過key來查找其對應(yīng)的值其時間復(fù)雜度是O(1),下面這篇文章就來給大家介紹介紹python利用拉鏈法實現(xiàn)字典的方法。
在Python中怎樣用列表實現(xiàn)字典?
用列表實現(xiàn)字典最大的問題就是解決hash沖突,如果在列表中通過計算不同的key得到相同的相同了位置,這時候應(yīng)該怎么辦?
最簡單的辦法就是使用拉鏈法.

拉鏈法:就是在一個列表中每個位置再添加一個列表,這樣就算是有hash沖突也能夠存儲進去,當(dāng)選取的hash函數(shù)足夠好,
num的數(shù)足夠大,就能夠保證列表中的每一個列表里面只有一個元素。根據(jù)key計算的元素所在的位置,然后來取值就能達
到O(1)的時間。
方法示例
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): # 根據(jù)指定的 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): # 根據(jù) 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查到的時間,可見下圖

總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
Python高級數(shù)據(jù)分析之pandas和matplotlib繪圖
Matplotlib是一個強大的Python繪圖和數(shù)據(jù)可視化的工具包,下面這篇文章主要給大家介紹了關(guān)于Python高級數(shù)據(jù)分析之pandas和matplotlib繪圖的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-05-05
python+requests接口壓力測試500次,查看響應(yīng)時間的實例
這篇文章主要介紹了python+requests接口壓力測試500次,查看響應(yīng)時間的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-04-04
python 非線性規(guī)劃方式(scipy.optimize.minimize)
今天小編就為大家分享一篇python 非線性規(guī)劃方式(scipy.optimize.minimize),具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-02-02

