前言
字典也叫散列表,最大的特點是通過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查到的時間,可見下圖
總結
以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對武林站長站的支持。
新聞熱點
疑難解答