首页 > 编程语言 > 详细

python-10-set详解

时间:2020-04-21 13:58:07      阅读:504      评论:0      收藏:0      [点我收藏+]

集 set

  • 约定
    • set 翻译为集
    • collection 翻译集合类型,是一个大概念
  • set
    • 可变的、无序的、不重复的元素的集合
    • 但是也有顺序集合,比如java当中的treeset,有排序的

集当中的元素是散放的,是一个散列值,是个哈希。

python当中所有数据结构,在其他语言当中都能够找到。
列表更适合尾部追加,两头要操作就要用queue。
前面学过的可变的,就是bytearray,list。
可变不可变,指的就是能不能就地修改。

集合当中的元素,本身就是不能重复的。
集合最大的一个用处,就是去重。

set定义 初始化
  • set() -> new empty set object
  • set(iterable) -> new set object
s1 = set()
s2 = set(range(5))
s3 = set(list(range(10)))
s4 = {} # dict
s5 = {9,10,11} # set
s6 = {(1,2),3,‘a‘}
s7 = {[1],(1,)1} # ?
s = set(enumerate(range(10)))
s = set(range(10))
s = {}
type(s) # dict,集合当中什么都不写,这个就是字典了
s = {1}
type(s) # set
s1 = set() # 这个才是定义一个空的字典。
s = {(1,2),2,None}
s = {(1,2),2,None,‘abc‘,b‘abc‘,[1]} # unhashable type : ‘list‘
# list是一个不可哈希类型的。
# set当中的元素,要么都是不可变类型,要么就是一个单值。
s = {(1,2),2,None,‘abc‘,b‘abc‘,bytearray(b‘abc‘)}
  • 集合很重要的一个特点,就是无序、去重。
  • 在python当中有可变不可变的区别。
set的元素
  • set的元素必须可以hash
  • 目前学过的不可hash的类型有list,set
  • 元素不可以索引
  • set可以迭代
hash(‘abc‘) 
hash(b‘abc‘)
上面两个哈希值一样 
hash(10000000)
hash(1)
s = set([‘abc‘,b‘abc‘]) # ‘abc‘,b‘abc‘两个哈希值一样,但是可以存进去的。
set??
set(s)

无序是迭代的,不可以索引,成员运算符,是可以的。

set增加
  • add(element)
    • 增加一个元素到set当中
    • 如果元素存在,什么都不做
  • update(*others
    • 合并其他元素到set集合当中来
    • 参数others必须是可迭代对象
    • 就地修改
s = add(2)
s = update({1,2,3}) # 这个就是在做集合运算了
s = update([1,2,3],[1,3,4]) # 给了两个集合,把多个集合合并到当前集合
s = update([1,2,3],[1,3,4],(11,23,45)) 
s = update([1,2,3],[1,3,4],[11,23,45]) 
set删除
  • remove(element)
    • 从set中移除一个元素
    • 元素不存在,抛出来keyError异常
  • discard(element)
    • 从set中移除一个元素
    • 元素不存在,什么都不做
  • pop() -> item
    • 移除并返回任意的元素,为什么是任意元素
    • 空集返回KeyError异常
  • clear()
    • 移除所有元素
移除的方式,就是求了元素的哈希值。

顺序结构的移除,就是要遍历一遍的。用索引,找的过程很快。
找到这个值,就是O(1)的。
但是移除这个值之后,后面的元素都要向前补充一下,所以速度慢。

但是集合是通过值的hash来进行移除的,这个hash就是相当于值的key。
移除了之后,大家也不用移动位置。
所以效率还是很高的。

技术分享图片

pop?
help(s.pop())
s.pop()当中不要传参数
a = s.pop()
  • remove和pop都是要产生异常的,用的时候要注意异常处理
  • discard是弃用的意思,元素不存在,什么都不做,应该是比较安全的方法,相对于remove
  • 这里remove和pop都会面临到异常处理的问题,discard就没有这个问题。
总结:
1. remove() 有异常处理
2. pop() 有异常处理
3. discard() 无异常处理
4. clear() 无异常处理

移除元素,都会面临到一个垃圾回收的问题。

set修改、查询
  • 修改
    • 要么删除,要么加入新的元素,因为没有重复的元素,修改就是新的。
    • 为什么没有修改?
  • 查询
    • 非线性结构,无法索引
  • 遍历
    • 可以迭代所有元素
  • 成员运算符
    • in 和 not in判断元素是否在set当中
    • 效率呢?
    • 这个效率是相当高的,相当于用索引访问线性结构
    • 非线性结构用哈希值来定位,相当于用索引遍历列表
    • 时间复杂度,就是相当于O(1)

技术分享图片

set成员运算符的比较
  • list和set的比较
  • lst1 = list(range(100))
  • lst2 = list(range(1000000))
  • -1 in lst1、-1 in lst2 看看效率,随着规模的增加,应该时间会很低。
  • set1 = set(range(100))
  • set2 = set(range(1000000))
  • -1 in set1、-1 in set2 看看效率,随着规模的增加,应该没有多大区别。
%%timeit lst1 = list(range(100))
-1 in lst1 # 这个就是true或者false的问题。-1必须遍历全部。

%%timeit set1 = set(range(100)) # set_up_code 不计时了
-1 in set1 # 这个就是true或者false的问题。-1必须遍历全部。

当我们判断或者迭代的时候,用set效率会更高。

set和线性结构
  • 线性结构的查询时间复杂度是O(n),随着数据规模的增大而增加耗时

  • set、dict等结构,内部使用hash值作为key,时间复杂度可以做到O(1),查询时间和数据规模无关

  • 可hash

    • 数值型:int float complex # 字面常量
    • 布尔值:True False # 整形的子类
    • 字符串:String bytes # 字面常量
    • tuple
    • None
    • 以上都是不可变类型,成为可哈希类型,hashable
  • set的元素必须是可以hash的。

这里不要和可迭代对象搞混了,只要可迭代对象当中的元素是可以哈希的,那么就可以
s = set(list)这种用法

集合
  • 基本概念
    • 全集
      • 所有元素的集合,例如实数集,所有实数组成的集合,就是全集
    • 子集subset和超集superset
      • 一个集合A所有元素都在另外一个集合B内,A是B的子集,B是A的超集
    • 真子集合真超集
      • A是B的子集,且A不等于B,A就是B的真子集,B就是A的真超集
    • 并集:多个集合合并的结果
    • 交集:多个集合的公共部分
    • 差集:集合当中除去和其他集合公共部分

技术分享图片

python-10-set详解

原文:https://www.cnblogs.com/gnuzsx/p/12743831.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!