python内置数据结构基础认知:set
set # 可变的、无序的、不重复的元素的集合;可迭代不可索引
set() -> new empty set object
set(iterable) -> new set object
set和线性结构:
可hash:
# 数值型int、float、complex
# 布尔型True、False
# 字符串string、bytes
# tuple p None
# 以上都是不可变类型,成为可哈希类型,hashable
不可hash:
# 列表[ ]
# set { }
# bytearray
set集合里只能放可hash的元素,不能放列表、set、bytearray等不可hash的元素
set集合里的元素必须是可hash的;set本身不可hash
set里的元素必须经过hash后得到一个hash值(key),该值代表该元素在内存里的唯一地址,当需要set里的元素时,该元素再经过hash计算出其hash值,直接找到其内存地址,时间复杂度O(1),也就是说set集合并不会因其数据规模增大而降低效率
set增加 -> None:
.add(elem) # 增加一个元素到set中;如果元素存在,则什么也不做
.update(*others) # 合并其他可迭代的对象里的元素到set中;()里可以放多个可迭代对象,逗号分割开
set删除:
.remove(elem) # 移除元素;元素不存在,返回KeyError异常(查找set中元素时,是先算该元素的hash值,hash值为Key,用Key来查找元素;找不到元素进行删除则返回Key异常)
.discard(elem) # 移除元素;元素不存在,什么也不做
.pop() ->item # 移除并返回任意的元素(因set不可索引);空集返回KeyError异常
.clear() # 移除所有元素
set只能删除元素和加入新的元素,没有修改,不可查询(因set不可索引);可以迭代
in 和not in set #效率很高,时间复杂度O(1)
集合
并集
| #两个集合所有的元素合并到一起,相同的部分只要一份
.union(*others) -> new set # 返回和多个集合合并后的新的集合
.update(*others) -> None # 和多个集合合并,就地修改
例子:s1.union(s2,s3) #返回s1、s2和s3的并集,可用变量去接
s1.update(s2,s3) #s1变为s1、s2和s3的并集
交集
& # 返回两个集合相同的元素
.intersection(*others) -> new set # 返回和多个集合的交集
.intersection_update(*others) ->None # 获取和多个集合的交集,并就地修改
差集
- # A-B返回所有属于A且不属于B的元素组成的集合
.difference(*others) ->new set # 返回和多个集合的差集
.difference_update(*others) ->None # 获取和多个集合的差集并就地修改
对称差集
^ # 集合A和B,由所有不属于A和B的交集元素组成的集合,可以记为A|B-A&B