首頁  >  文章  >  後端開發  >  詳解python利用拉鍊法實作字典方法範例程式碼

詳解python利用拉鍊法實作字典方法範例程式碼

高洛峰
高洛峰原創
2017-03-26 09:46:281812瀏覽

這篇文章主要介紹了python利用拉鍊法實現字典的方法,文中給出了詳細的示例代碼,相信對大家具有一定的參考價值,需要的朋友可以們下面來一起看看吧。

前言

字典也叫散列表,最大的特點是透過key來找出其對應的值其時間複雜度是O( 1),以下這篇文章就來跟大家介紹介紹python利用拉鍊法實作字典的方法。

在Python中怎樣用列表實現字典?

用列表實現字典最大的問題就是解決hash衝突,如果在列表中通過計算不同的key得到相同的相同了位置,這時候該怎麼辦?

最簡單的辦法就是使用拉鍊法.

詳解python利用拉鍊法實作字典方法範例程式碼

拉鍊法:就是在一個列表中每個位置再添加一個列表,這樣就算是有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利用拉鍊法實作字典方法範例程式碼

以上是詳解python利用拉鍊法實作字典方法範例程式碼的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn