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

Python 實(shí)現(xiàn)集合Set的示例

 更新時(shí)間:2020年12月21日 15:57:48   作者:_慕  
這篇文章主要介紹了Python 實(shí)現(xiàn)集合Set的示例,幫助大家更好的理解和使用python,感興趣的朋友可以了解下

Python的集合set原理

集合(set)是一個(gè)無(wú)序的不重復(fù)元素序列。

可以使用大括號(hào) { } 或者 set() 函數(shù)創(chuàng)建集合,注意:創(chuàng)建一個(gè)空集合必須用 set() 而不是 { },因?yàn)?{ } 是用來(lái)創(chuàng)建一個(gè)空字典。

class Array(object):

 def __init__(self, size=32, init=None):
  self._size = size
  self._items = [init] * self._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(len(self._items)):
   self._items[i] = value

 def __iter__(self):
  for item in self._items:
   yield item

class Slot(object):
 """定義一個(gè) hash 表 數(shù)組的槽
 注意,一個(gè)槽有三種狀態(tài),看你能否想明白
 1.從未使用 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, self.value = key, value

class HashTable(object):
 # 表示從未被使用過(guò)
 UNUSED = None
 # 使用過(guò),但是被刪除了
 EMPTY = Slot(None, None)

 def __init__(self):
  self._table = Array(8, init=HashTable.UNUSED)
  self.length = 0

 # 負(fù)載因子
 @property
 def _load_factor(self):
  return self.length/float(len(self._table))

 def __len__(self):
  return self.length

 # 哈希函數(shù) 用內(nèi)置的哈希哈數(shù)進(jìn)行哈希一下,然后對(duì)數(shù)組長(zhǎng)度取模
 def _hash(self, key):
  return abs(hash(key)) % len(self._table)

 def _find_key(self, key):
  # 得到第一個(gè)值的位置
  index = self._hash(key)
  _len = len(self._table)
  # 當(dāng)這個(gè)槽不是未使用過(guò)的,才接著往下找;如果是未使用過(guò)的,這個(gè)key肯定不存在
  while self._table[index] is not HashTable.UNUSED:
   # 槽使用過(guò),但是被刪除了
   if self._table[index] is HashTable.EMPTY:
    # cpython解決哈希沖突的一種方式
    index = (index*5 + 1) % _len
    continue
   elif self._table[index] == key:
    return index
   else:
    index = (index * 5 + 1) % _len
  return None

 # 檢測(cè)槽是否能被插入
 def _slot_can_insert(self, index):
  return (self._table[index] is HashTable.EMPTY or self._table[index] is HashTable.UNUSED)

 # 找到能被插入的槽的index
 def _find_slot_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

 # in 操作符
 def __contains__(self, key):
  index = self._find_key(key)
  return index is not None

 def add(self, key, value):
  if key in self:
   index = self._find_key(key)
   # 更新值
   self._table[index].value = value
   return False
  else:
   index = self._find_slot_insert(key)
   self._table[index] = Slot(key, value)
   self.length += 1
   if self._load_factor > 0.8:
    return self._rehash()
   return True

 def _rehash(self):
  oldtable = self._table
  newsize = len(self._table) * 2
  # 新的table
  self._table = Array(newsize, HashTable.UNUSED)
  self.length = 0
  for slot in oldtable:
   if slot is not HashTable.UNUSED and slot is not HashTable.EMPTY:
    index = self._find_slot_insert(slot.key)
    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
  # 把槽設(shè)置為空槽
  self._table[index] = HashTable.EMPTY
  return value

 def __iter__(self):
  for slot in self._table:
   if slot not in (HashTable.UNUSED, HashTable.EMPTY):
    yield slot.value


class SetADT(HashTable):

 def add(self, key):
  return super(SetADT, self).add(key, True)

 def __and__(self, other_set):
  # 求交集
  new_set = SetADT()
  for element_a in self:
   if element_a in other_set:
    new_set.add(element_a)
  return new_set

 def __sub__(self, other_set):
  # 求差集
  new_set = SetADT()
  for element_a in self:
   if element_a not in other_set:
    new_set.add(element_a)
  return new_set

 def __or__(self, other_set):
  # 求交集
  new_set = SetADT()
  for element_a in self:
   new_set.add(element_a)
  for element_b in other_set:
   new_set.add(element_b)
  return new_set

以上就是Python 實(shí)現(xiàn)集合Set的示例的詳細(xì)內(nèi)容,更多關(guān)于Python 實(shí)現(xiàn)集合Set的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 后端開發(fā)使用pycharm的技巧(推薦)

    后端開發(fā)使用pycharm的技巧(推薦)

    這篇文章主要介紹了后端開發(fā)使用pycharm的技巧,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • Python使用Traits庫(kù)實(shí)現(xiàn)對(duì)象屬性

    Python使用Traits庫(kù)實(shí)現(xiàn)對(duì)象屬性

    Python作為一種動(dòng)態(tài)編程語(yǔ)言,它的變量沒(méi)有類型,這種靈活性給快速開發(fā)帶來(lái)很多便利,不過(guò)它也不是沒(méi)有缺點(diǎn),Traits庫(kù)的一個(gè)很重要的目的就是為了解決這些缺點(diǎn)所帶來(lái)的問(wèn)題,trait為Python對(duì)象的屬性增加了類型定義的功能
    2023-11-11
  • Python cx_freeze打包工具處理問(wèn)題思路及解決辦法

    Python cx_freeze打包工具處理問(wèn)題思路及解決辦法

    這篇文章主要介紹了Python cx_freeze打包工具處理問(wèn)題思路及解決辦法的相關(guān)資料,需要的朋友可以參考下
    2016-02-02
  • 使用Python第三方庫(kù)pygame寫個(gè)貪吃蛇小游戲

    使用Python第三方庫(kù)pygame寫個(gè)貪吃蛇小游戲

    這篇文章主要介紹了使用Python第三方庫(kù)pygame寫個(gè)貪吃蛇小游戲,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-03-03
  • 解決python super()調(diào)用多重繼承函數(shù)的問(wèn)題

    解決python super()調(diào)用多重繼承函數(shù)的問(wèn)題

    今天小編就為大家分享一篇解決python super()調(diào)用多重繼承函數(shù)的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-06-06
  • python 多線程爬取壁紙網(wǎng)站的示例

    python 多線程爬取壁紙網(wǎng)站的示例

    這篇文章主要介紹了python 多線程爬取壁紙網(wǎng)站的示例,幫助大家更好的理解和學(xué)習(xí)使用python,感興趣的朋友可以了解下
    2021-02-02
  • Python+Django+MySQL實(shí)現(xiàn)基于Web版的增刪改查的示例代碼

    Python+Django+MySQL實(shí)現(xiàn)基于Web版的增刪改查的示例代碼

    這篇文章主要介紹了Python+Django+MySQL實(shí)現(xiàn)基于Web版的增刪改查的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2020-05-05
  • Python中for循環(huán)可迭代對(duì)象迭代器及生成器源碼學(xué)習(xí)

    Python中for循環(huán)可迭代對(duì)象迭代器及生成器源碼學(xué)習(xí)

    這篇文章主要為大家介紹了Python中for循環(huán)可迭代對(duì)象迭代器及生成器的源碼學(xué)習(xí),有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-05-05
  • Python的函數(shù)嵌套的使用方法

    Python的函數(shù)嵌套的使用方法

    這篇文章主要介紹了Python的函數(shù)嵌套的使用方法,有需要的朋友可以參考一下
    2014-01-01
  • 解決Python報(bào)錯(cuò)Valueerror: Expected 2d Array Got 1d Array Instead

    解決Python報(bào)錯(cuò)Valueerror: Expected 2d Array 

    如您所知,每種編程語(yǔ)言都會(huì)遇到很多錯(cuò)誤,有些是在運(yùn)行時(shí),有些是在編譯時(shí),下面我就來(lái)看看當(dāng)發(fā)生錯(cuò)誤 ValueError: Expected 2D array, got 1D array instead時(shí)該如何解決吧
    2024-01-01

最新評(píng)論

板桥市| 乡城县| 平湖市| 滦平县| 大田县| 三门峡市| 德州市| 巢湖市| 渝北区| 米泉市| 湄潭县| 鄄城县| 怀来县| 兰州市| 清远市| 宁国市| 济宁市| 四子王旗| 宾阳县| 台江县| 神木县| 锦屏县| 开化县| 聂荣县| 柘城县| 宝坻区| 黔南| 安义县| 桑植县| 佛坪县| 德阳市| 和田县| 邹平县| 耿马| 上犹县| 泰兴市| 宁河县| 长春市| 萝北县| 湘潭县| 德庆县|