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