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

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

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

