欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

python 哈希表實(shí)現(xiàn)簡(jiǎn)單python字典代碼實(shí)例

 更新時(shí)間:2019年09月27日 10:30:10   作者:DRQ丶  
這篇文章主要介紹了python 哈希表實(shí)現(xiàn)簡(jiǎn)單python字典代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

這篇文章主要介紹了python 哈希表實(shí)現(xiàn)簡(jiǎn)單python字典代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下

class Array(object):
  def __init__(self, size = 32, init = None):
    self._size = size
    self._items = [init] * size
  def __getitem__(self, index):
    return self._items[index]
  def __setitem__(self, index, value):
    self._items[index] = value
  def __len__(self):
    return self._size
  def clear(self, value = None):
    for i in range(self,_items):
      self._items[i] = value
  def __iter__(self):
    for item in self._items:
      yield item
class Slot(object):
  """
  定義一個(gè)哈希表數(shù)組的槽
  注意:一個(gè)槽有三種狀態(tài)
  1. 從未被使用過,HashMap.UNUSED。 此槽沒有被使用和沖突過,查找時(shí)只要找到UNUSED 就不用再繼續(xù)探查了
  2. 使用過但是remove了, 此時(shí)是HashMap.EMPTY,該談差點(diǎn)后面的元素仍可能是有key
  3. 槽正在使用Slot 節(jié)點(diǎn)
  """
  def __init__(self, key, value):
    self.key = key
    self.value = value
class HashTable(object):
  UNUSED = None # 表示slot 沒有被使用過
  EMPTY = Slot(None, None) # 使用過被刪除
  def __init__(self):
    self._table = Array(8, init = HashTable.UNUSED) # 初始化,數(shù)組的每個(gè)元素都是UNUSED
    self.length = 0
  @property # 內(nèi)置裝飾器,把方法變成屬性
  def _load_factor(self):
    return self.length/float(len(self._table))
  def __len__(self):
    return self.length
  def _hash(self, key):
    return abs(hash(key)) % len(self._table) # abs函數(shù)返回絕對(duì)值 hash 是內(nèi)置函數(shù) _hash 直接使用內(nèi)置的哈希函數(shù),對(duì)數(shù)組的長(zhǎng)度取模
  def _find_key(self, key):
    index = self._hash(key) # 先用 _hash方法計(jì)算出槽的位置
    _len = len(self._table) # 現(xiàn)保存下來長(zhǎng)度
    while self._table[index] is not HashTable.UNUSED:  # 如果這個(gè)槽不是沒有被使用過
      if self._table[index] is HashTable.EMPTY: # 如果這個(gè)槽是,曾經(jīng)有過值,不過被刪除了
        index = (index*5 +1 ) % _len    # cpython 使用的一種解決哈希沖突的方式
        continue
      elif self._table[index].key == key: # 正在使用, 如果key值相同
        return index
      else: # 這里就只剩最后一種可能, 正在使用,但是key沒有找到
        index = (index *5 +1) % _len
    return None
  def _slot_can_insert(self, index): # 判斷一個(gè)槽是否可以插入
    return (self._table[index] is HashTable.EMPTY or self._table[index] is HashTable.UNUSED)
  def _find_slot_for_insert(self,key):  # 尋找一個(gè)空槽,用來插入
    index = self._hash(key)
    _len = len(self._table)
    while not self._slot_can_insert(index):
      index = (index*5 + 1) % _len
    return index
  def __contains__(self, key):   # 實(shí)現(xiàn)一個(gè)in操作符
    index = self._find_key(key)
    return index is not None
  def add(self, key, value):
    if key in self:  # 上面實(shí)現(xiàn)的in操作符
      index = self._find_key(key)
      self._table[index].value = value
      return False  # 返回False 表示沒有執(zhí)行插入操作,執(zhí)行的是更新操作
    else:
      index = self._find_slot_for_insert(key)
      self._table[index] = Slot(key, value) # 這兩部可能會(huì)調(diào)用_slot_can_insert 函數(shù),不管是哪種情況,EMPTY 或 是 UNUSEZD,都將這個(gè)節(jié)點(diǎn)聲明為Slot類
      self.length += 1
      if self._load_factor >= 0.8:
        self._rehash()   # 當(dāng)空間占用大于0.8 的時(shí)候,進(jìn)行rehash 重新分配空間。
      return True
  def _rehash(self):
    old_table = self._table
    newsize = len(self._table) *2
    self._table = Array(newsize, HashTable.UNUSED)
    self.length = 0
    for slot in old_table:
      if slot is not HashTable.UNUSED and slot is not HashTable.EMPTY:  # 判斷這個(gè)slot 是有值的
        index = self._find_slot_for_insert(slot.key)  # 找到一個(gè)可以插入的槽
        self._table[index] = slot
        self.length += 1
  def get(self, key, default = None):
    index = self._find_key(key)
    if index is None:
      return default
    else:
      return self._table[index].value
  def remove(self,key):
    index = self._find_key(key)
    if index is None:
      raise KeyError()
    value = self._table[index].value
    self.length -= 1
    self._table[index] = HashTable.EMPTY
    return value
  def __iter__(self):   # 遍歷操作,python 字典默認(rèn)遍歷的是key,這里實(shí)現(xiàn)的也是遍歷key
    for slot in self._table:
      if slot not in(HashTable.EMPTY, HashTable.UNUSED):
        yield slot.key
class DictADT(HashTable):

  def __setitem__(self, key, value):  # 設(shè)定給定鍵的值
    self.add(key, value)
  def __getitem__(self, key):   # 返回給定鍵的值
    if key not in self:
      raise KeyError()
    else:
      return self.get(key)
  def _iter_slot(self):
    for slot in self._table:
      if slot not in (HashTable.EMPTY, HashTable.UNUSED):
        yield slot
  def items(self):
    for slot in self._iter_slot():
      yield (slot.key, slot.value)
  def keys(self):
    for slot in self._iter_slot():
      yield slot.key
  def values(self):
    for slot in self._iter_slot():
      yield slot.value
def test_dict():
  import random
  d = DictADT()
  d['a'] = 1   # 這時(shí)候調(diào)用 __setitem__ 方法
  assert d['a'] == 1
  d.remove('a')
  l = list(range(30))
  random.suffle(l)  # 打亂l
  for i in l:
    d.add(i, i )
  for i in range(30):
    assert d.get(i) == i
  assert sorted (list(d.keys())) == sorted(l)

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 使用jupyter notebook運(yùn)行python和R的步驟

    使用jupyter notebook運(yùn)行python和R的步驟

    這篇文章主要介紹了使用jupyter notebook運(yùn)行python和R的步驟,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-08-08
  • Python3 ID3決策樹判斷申請(qǐng)貸款是否成功的實(shí)現(xiàn)代碼

    Python3 ID3決策樹判斷申請(qǐng)貸款是否成功的實(shí)現(xiàn)代碼

    這篇文章主要介紹了Python3 ID3決策樹判斷申請(qǐng)貸款是否成功的實(shí)現(xiàn)代碼,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • pandas溫差查詢案例的實(shí)現(xiàn)

    pandas溫差查詢案例的實(shí)現(xiàn)

    本文主要介紹了pandas溫差查詢案例的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-06-06
  • 吳恩達(dá)機(jī)器學(xué)習(xí)練習(xí):神經(jīng)網(wǎng)絡(luò)(反向傳播)

    吳恩達(dá)機(jī)器學(xué)習(xí)練習(xí):神經(jīng)網(wǎng)絡(luò)(反向傳播)

    這篇文章主要介紹了學(xué)習(xí)吳恩達(dá)機(jī)器學(xué)習(xí)中的一個(gè)練習(xí):神經(jīng)網(wǎng)絡(luò)(反向傳播),在這個(gè)練習(xí)中,你將實(shí)現(xiàn)反向傳播算法來學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)的參數(shù),需要的朋友可以參考下
    2021-04-04
  • 關(guān)于Python 3中print函數(shù)的換行詳解

    關(guān)于Python 3中print函數(shù)的換行詳解

    最近在學(xué)習(xí)python3,發(fā)現(xiàn)了一個(gè)問題想著總結(jié)出來,所以下面這篇文章主要給大家介紹了關(guān)于Python 3中print函數(shù)換行的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)需要的朋友們具有一定的參考學(xué)習(xí)價(jià)值,感興趣的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧。
    2017-08-08
  • python多線程性能測(cè)試之快速mock數(shù)據(jù)

    python多線程性能測(cè)試之快速mock數(shù)據(jù)

    這篇文章主要為大家介紹了python多線程性能測(cè)試之快速mock數(shù)據(jù),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Python?pickle模塊實(shí)現(xiàn)Python對(duì)象持久化存儲(chǔ)

    Python?pickle模塊實(shí)現(xiàn)Python對(duì)象持久化存儲(chǔ)

    這篇文章主要介紹了Python?pickle模塊實(shí)現(xiàn)Python對(duì)象持久化存儲(chǔ),pickle?是?python?語(yǔ)言的一個(gè)標(biāo)準(zhǔn)模塊,和python安裝時(shí)共同安裝好的一個(gè)模塊。下文基于pickle模塊展開實(shí)現(xiàn)Python對(duì)象持久化存儲(chǔ)的詳細(xì)內(nèi)容,需要的朋友可以參考一下
    2022-05-05
  • python實(shí)現(xiàn)飛機(jī)大戰(zhàn)微信小游戲

    python實(shí)現(xiàn)飛機(jī)大戰(zhàn)微信小游戲

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)飛機(jī)大戰(zhàn)微信小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-09-09
  • python處理兩種分隔符的數(shù)據(jù)集方法

    python處理兩種分隔符的數(shù)據(jù)集方法

    今天小編就為大家分享一篇python處理兩種分隔符的數(shù)據(jù)集方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-12-12
  • Python引用(import)文件夾下的py文件的方法

    Python引用(import)文件夾下的py文件的方法

    這篇文章主要介紹了Python引用(import)文件夾下的py文件的方法,Python中比較特別,導(dǎo)入文件夾下的py文件,則這個(gè)目錄下必須要有一個(gè)__init__.py文件才可,需要的朋友可以參考下
    2014-08-08

最新評(píng)論