最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

這篇文章主要介紹了python 哈希表實(shí)現(xiàn)簡(jiǎn)單python字典代碼實(shí)例,文中通過(guò)示例代碼介紹的非常詳細(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. 從未被使用過(guò),HashMap.UNUSED。 此槽沒(méi)有被使用和沖突過(guò),查找時(shí)只要找到UNUSED 就不用再繼續(xù)探查了
  2. 使用過(guò)但是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 沒(méi)有被使用過(guò)
  EMPTY = Slot(None, None) # 使用過(guò)被刪除
  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)保存下來(lái)長(zhǎng)度
    while self._table[index] is not HashTable.UNUSED:  # 如果這個(gè)槽不是沒(méi)有被使用過(guò)
      if self._table[index] is HashTable.EMPTY: # 如果這個(gè)槽是,曾經(jīng)有過(guò)值,不過(guò)被刪除了
        index = (index*5 +1 ) % _len    # cpython 使用的一種解決哈希沖突的方式
        continue
      elif self._table[index].key == key: # 正在使用, 如果key值相同
        return index
      else: # 這里就只剩最后一種可能, 正在使用,但是key沒(méi)有找到
        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è)空槽,用來(lái)插入
    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 表示沒(méi)有執(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)文章

  • Python深入分析@property裝飾器的應(yīng)用

    Python深入分析@property裝飾器的應(yīng)用

    這篇文章主要介紹了Python @property裝飾器的用法,在Python中,可以通過(guò)@property裝飾器將一個(gè)方法轉(zhuǎn)換為屬性,從而實(shí)現(xiàn)用于計(jì)算的屬性,下面文章圍繞主題展開(kāi)更多相關(guān)詳情,感興趣的小伙伴可以參考一下
    2022-07-07
  • 使用Python腳本分析瀏覽器的瀏覽記錄

    使用Python腳本分析瀏覽器的瀏覽記錄

    這篇文章主要為大家詳細(xì)介紹了如何使用Python腳本分析一下男朋友谷歌瀏覽器的瀏覽記錄,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以參考一下
    2025-03-03
  • Python實(shí)現(xiàn)發(fā)票自動(dòng)校核微信機(jī)器人的方法

    Python實(shí)現(xiàn)發(fā)票自動(dòng)校核微信機(jī)器人的方法

    這篇文章主要介紹了Python實(shí)現(xiàn)發(fā)票自動(dòng)校核微信機(jī)器人的方法,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-05-05
  • 刪除pandas中產(chǎn)生Unnamed:0列的操作

    刪除pandas中產(chǎn)生Unnamed:0列的操作

    這篇文章主要介紹了刪除pandas中產(chǎn)生Unnamed:0列的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-03-03
  • Python+OpenCV手勢(shì)檢測(cè)與識(shí)別Mediapipe基礎(chǔ)篇

    Python+OpenCV手勢(shì)檢測(cè)與識(shí)別Mediapipe基礎(chǔ)篇

    網(wǎng)上搜到了一些關(guān)于手勢(shì)處理的實(shí)驗(yàn),我在這兒簡(jiǎn)單的實(shí)現(xiàn)一下,下面這篇文章主要給大家介紹了關(guān)于Python+OpenCV手勢(shì)檢測(cè)與識(shí)別Mediapipe基礎(chǔ)篇的相關(guān)資料,需要的朋友可以參考下
    2022-12-12
  • 教你利用python的matplotlib(pyplot)繪制折線圖和柱狀圖

    教你利用python的matplotlib(pyplot)繪制折線圖和柱狀圖

    Python繪圖需要下載安裝matplotlib模塊,它是一個(gè)數(shù)學(xué)繪圖庫(kù),我們將使用它來(lái)制作簡(jiǎn)單的圖表,如折線圖和散點(diǎn)圖,下面這篇文章主要給大家介紹了關(guān)于利用python的matplotlib(pyplot)繪制折線圖和柱狀圖的相關(guān)資料,需要的朋友可以參考下
    2022-05-05
  • 使用Python的Flask框架實(shí)現(xiàn)視頻的流媒體傳輸

    使用Python的Flask框架實(shí)現(xiàn)視頻的流媒體傳輸

    這篇文章主要介紹了使用Python的Flask框架實(shí)現(xiàn)視頻的流媒體傳輸,包括從攝像機(jī)獲取幀到web瀏覽器的數(shù)字流傳輸,需要的朋友可以參考下
    2015-03-03
  • Python中層次聚類的詳細(xì)講解

    Python中層次聚類的詳細(xì)講解

    層次聚類( Hierarchical Clustering )是聚類算法的一種,通過(guò)計(jì)算不同類別的相似度類創(chuàng)建一個(gè)有層次的嵌套的樹(shù),下面這篇文章主要給大家介紹了關(guān)于Python中層次聚類的詳細(xì)講解,需要的朋友可以參考下
    2022-12-12
  • Django websocket原理及功能實(shí)現(xiàn)代碼

    Django websocket原理及功能實(shí)現(xiàn)代碼

    這篇文章主要介紹了Django websocket原理及功能實(shí)現(xiàn)代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2020-11-11
  • python?如何使用requests下載文件

    python?如何使用requests下載文件

    這篇文章主要介紹了python?如何使用requests下載文件,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評(píng)論

随州市| 眉山市| 安达市| 庆元县| 大宁县| 中江县| 闵行区| 类乌齐县| 阿尔山市| 界首市| 望都县| 惠州市| 西丰县| 滨州市| 永昌县| 息烽县| 彩票| 嘉兴市| 托克逊县| 万载县| 黎平县| 瓮安县| 临西县| 古浪县| 水富县| 准格尔旗| 都安| 肃北| 西畴县| 大荔县| 错那县| 昌江| 大渡口区| 新龙县| 西平县| 阿拉善盟| 罗甸县| 肥乡县| 平昌县| 杭州市| 谢通门县|