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

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

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

Python的集合set原理

集合(set)是一個無序的不重復元素序列。

可以使用大括號 { } 或者 set() 函數(shù)創(chuàng)建集合,注意:創(chuàng)建一個空集合必須用 set() 而不是 { },因為 { } 是用來創(chuàng)建一個空字典。

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):
 """定義一個 hash 表 數(shù)組的槽
 注意,一個槽有三種狀態(tài),看你能否想明白
 1.從未使用 HashMap.UNUSED。此槽沒有被使用和沖突過,查找時只要找到 UNUSED 就不用再繼續(xù)探查了
 2.使用過但是 remove 了,此時是 HashMap.EMPTY,該探查點后邊的元素扔可能是有key
 3.槽正在使用 Slot 節(jié)點
 """
 def __init__(self, key, value):
  self.key, self.value = key, value

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

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

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

 def __len__(self):
  return self.length

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

 def _find_key(self, key):
  # 得到第一個值的位置
  index = self._hash(key)
  _len = len(self._table)
  # 當這個槽不是未使用過的,才接著往下找;如果是未使用過的,這個key肯定不存在
  while self._table[index] is not HashTable.UNUSED:
   # 槽使用過,但是被刪除了
   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

 # 檢測槽是否能被插入
 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):
  # 得到第一個值的位置
  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
  # 把槽設置為空槽
  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 實現(xiàn)集合Set的示例的詳細內容,更多關于Python 實現(xiàn)集合Set的資料請關注腳本之家其它相關文章!

相關文章

  • python機器學習基礎特征工程算法詳解

    python機器學習基礎特征工程算法詳解

    這篇文章主要為大家介紹了python機器學習基礎特征工程的算法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步早日升職加薪
    2021-11-11
  • 使用Python Fast API發(fā)布API服務的過程詳解

    使用Python Fast API發(fā)布API服務的過程詳解

    這篇文章主要介紹了使用Python Fast API發(fā)布API服務,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-04-04
  • Python限制內存和CPU使用量的方法(Unix系統(tǒng)適用)

    Python限制內存和CPU使用量的方法(Unix系統(tǒng)適用)

    這篇文章主要介紹了Python限制內存和CPU的使用量的方法,文中講解非常細致,代碼幫助大家更好的理解和學習,感興趣的朋友可以了解下
    2020-08-08
  • Python簡單的GUI程序示例詳解

    Python簡單的GUI程序示例詳解

    這篇文章主要為大家詳細介紹了Python簡單的GUI程序示例,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-02-02
  • python?GUI多行輸入文本Text的實現(xiàn)

    python?GUI多行輸入文本Text的實現(xiàn)

    這篇文章主要介紹了python?GUI多行輸入文本Text的實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • python基于twisted框架編寫簡單聊天室

    python基于twisted框架編寫簡單聊天室

    這篇文章主要為大家詳細介紹了python基于twisted框架編寫簡單聊天室,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 基于PyQT5制作英雄聯(lián)盟全皮膚下載器

    基于PyQT5制作英雄聯(lián)盟全皮膚下載器

    這篇文章主要介紹了基于PyQt5制作的簡易英雄聯(lián)盟全皮膚下載器,文中的示例代碼講解詳細,感興趣的小伙伴可以跟隨小編一起動手嘗試一下
    2022-02-02
  • centos 安裝Python3 及對應的pip教程詳解

    centos 安裝Python3 及對應的pip教程詳解

    這篇文章主要介紹了centos 安裝Python3 及對應的pip的教程,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-06-06
  • Python正則表達式急速入門(小結)

    Python正則表達式急速入門(小結)

    這篇文章主要介紹了Python正則表達式急速入門(小結),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2019-12-12
  • Pycharm 創(chuàng)建 Django admin 用戶名和密碼的實例

    Pycharm 創(chuàng)建 Django admin 用戶名和密碼的實例

    今天小編就為大家分享一篇Pycharm 創(chuàng)建 Django admin 用戶名和密碼的實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-05-05

最新評論