Python 实现集合Set的示例


Posted in Python onDecember 21, 2020

Python的集合set原理

集合(set)是一个无序的不重复元素序列。

可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。

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 表 数组的槽
 注意,一个槽有三种状态,看你能否想明白
 1.从未使用 HashMap.UNUSED。此槽没有被使用和冲突过,查找时只要找到 UNUSED 就不用再继续探查了
 2.使用过但是 remove 了,此时是 HashMap.EMPTY,该探查点后边的元素扔可能是有key
 3.槽正在使用 Slot 节点
 """
 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

 # 哈希函数 用内置的哈希哈数进行哈希一下,然后对数组长度取模
 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 实现集合Set的示例的详细内容,更多关于Python 实现集合Set的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
在树莓派2或树莓派B+上安装Python和OpenCV的教程
Mar 30 Python
python 打印出所有的对象/模块的属性(实例代码)
Sep 11 Python
浅谈numpy中linspace的用法 (等差数列创建函数)
Jun 07 Python
Python基于回溯法子集树模板解决马踏棋盘问题示例
Sep 11 Python
判断python字典中key是否存在的两种方法
Aug 10 Python
用python建立两个Y轴的XY曲线图方法
Jul 08 Python
如何通过50行Python代码获取公众号全部文章
Jul 12 Python
tensorflow实现在函数中用tf.Print输出中间值
Jan 21 Python
xadmin使用formfield_for_dbfield函数过滤下拉表单实例
Apr 07 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
Sep 20 Python
python处理json数据文件
Apr 11 Python
什么是Python装饰器?如何定义和使用?
Apr 11 Python
Python 实现二叉查找树的示例代码
Dec 21 #Python
如何利用Python matplotlib绘制雷达图
Dec 21 #Python
OpenCV+python实现膨胀和腐蚀的示例
Dec 21 #Python
python opencv肤色检测的实现示例
Dec 21 #Python
OpenCV+Python3.5 简易手势识别的实现
Dec 21 #Python
如何使用python-opencv批量生成带噪点噪线的数字验证码
Dec 21 #Python
python 录制系统声音的示例
Dec 21 #Python
You might like
Could not load type System.ServiceModel.Activation.HttpModule解决办法
2012/12/29 PHP
浅谈php+phpStorm+xdebug配置方法
2015/09/17 PHP
php表单加入Token防止重复提交的方法分析
2016/10/10 PHP
什么是PHP文件?如何打开PHP文件?
2017/06/27 PHP
自动更新作用
2006/10/08 Javascript
JavaScript 申明函数的三种方法 每个函数就是一个对象(一)
2009/12/04 Javascript
jQuery 源码分析笔记(4) Ready函数
2011/06/02 Javascript
js获取域名的方法
2015/01/27 Javascript
node.js中的事件处理机制详解
2016/11/26 Javascript
JavaScript获取服务器端时间的方法
2016/11/29 Javascript
jQuery实现 上升、下降、删除、添加一行代码
2017/03/06 Javascript
angular.JS实现网页禁用调试、复制和剪切
2017/03/31 Javascript
JavaScript模板引擎实现原理实例详解
2018/12/14 Javascript
vue-cli 目录结构详细讲解总结
2019/01/15 Javascript
JavaScript之解构赋值的理解
2019/01/30 Javascript
vue列表单项展开收缩功能之this.$refs的详解
2019/05/05 Javascript
vue 自动化路由实现代码
2019/09/03 Javascript
vue - vue.config.js中devServer配置方式
2019/10/30 Javascript
[02:05]2014DOTA2国际邀请赛 BBC外卡赛赛后总结
2014/07/09 DOTA
Python操作SQLite简明教程
2014/07/10 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
django2用iframe标签完成网页内嵌播放b站视频功能
2018/06/20 Python
一行代码让 Python 的运行速度提高100倍
2018/10/08 Python
Python实现合并两个有序链表的方法示例
2019/01/31 Python
妙用itchat! python实现久坐提醒功能
2019/11/25 Python
Python项目跨域问题解决方案
2020/06/22 Python
Python如何将将模块分割成多个文件
2020/08/04 Python
Jimmy Choo美国官网:周仰杰鞋子品牌
2018/06/08 全球购物
漫威玩具服装及周边商品官方购物网站:Marvel Shop
2019/05/11 全球购物
乌克兰在线电子产品商店:MTA
2019/11/14 全球购物
为什么要做架构设计
2015/07/08 面试题
中学生思想品德评语
2014/12/31 职场文书
大学生求职简历自我评价
2015/03/02 职场文书
《小乌鸦爱妈妈》教学反思
2016/02/19 职场文书
《大禹治水》教学反思
2016/02/22 职场文书
实现一个简单得数据响应系统
2021/11/11 Javascript