這篇文章主要介紹了python利用拉鍊法實現字典的方法,文中給出了詳細的示例代碼,相信對大家具有一定的參考價值,需要的朋友可以們下面來一起看看吧。
前言
字典也叫散列表,最大的特點是透過key來找出其對應的值其時間複雜度是O( 1),以下這篇文章就來跟大家介紹介紹python利用拉鍊法實作字典的方法。
在Python中怎樣用列表實現字典?
用列表實現字典最大的問題就是解決hash衝突,如果在列表中通過計算不同的key得到相同的相同了位置,這時候該怎麼辦?
最簡單的辦法就是使用拉鍊法.
拉鍊法:就是在一個列表中每個位置再添加一個列表,這樣就算是有hash衝突也能夠儲存進去,當選取的hash函數夠好,
#num的數夠大,就能夠保證清單中的每一個清單裡面只有一個元素。根據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): # 根据指定的 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中文網其他相關文章!