Python数据结构集合-set

集合的定义

  集合 set,collection翻译为集合类型或容器,是一个大概念。

  集合特性:

    可变、无序、不重复、可迭代的元素的集合。

示例:

 

 

 

集合元素

1、set集合的元素要求必须是可hash的

2、目前所学过的不可hash的类型有:list、set、bytearray、dict

3、元素不可以索引,因为无序

4、set可使用for...in迭代   

示例,如下几种写法都是错误的:

  s5 = {'a',(1,2),bytearray(b'abc')}

  s5 = {'a',(1,2),bytearray(b'abc'),(1,2,[3])}

  s5 = {'a',(1,2),bytearray(b'abc'),(1,2,[3]),{1,2}}

  s5 = {'a',(1,2),{'a':100,'b':200},bytearray(b'abc'),(1,2,[3]),{1,2}}

 

返回typeError,unhashable type: 'dict'  'list' 'bytearray' 'set'  

 

set增加

  add():增加一个元素到set中,如果元素存在则什么也不做,生成新的集合

  update(*others):合并其他元素到set集合中,参数others必须是可迭代对象,就地修改

 

 

 

set删除

  remove(elem):从set中移除一个元素,元素不存在则抛出异常,KeyError

  discard(elem):从set中移除一个元素,元素不存在什么都不做,则不抛异常

  pop() -->item:移除并返回任意元素,因为是无序,所有不像列表不指定则是从尾部弹出,空集返回KeyError异常

  clear():移除集合,标记为丢弃和回收资源

 

 

 

set修改与查询

  要么删除,要么加入新的元素,非线性结构无法索引,但是可遍历迭代所有的元素; 

  成员运算符in、not in,判断元素是否在set集合中,效率极高:

 

 从上图得出,线性结构查询的时间复杂度为O(n),随着规模的增大,耗时越长;

set、dict等非线性结构,内部使用了hash算法,时间复杂度可以做到O(1),查询的时间和数据规模无关。

 

可哈希(hash)类型:

  数值型:int、float、complex

  布尔型:True、False

  字符串:string、bytes

  元组:tuple

  None

以上都是不可变类型,称之为可哈希类型,不可hash类型有:list、set、dict、bytearray,set元素必须是可hash。 

 

集合

集合概念:

  全集:所有元素的集合。

  子集:

    一个集合A所有的元素都在另外一个集合B内,A是B的子集,B是A的超集;

    A是B的子集,且A不等于B,A就是B的真子集,B是A的真超集。

  并集:多个集合合并的结果

  交集:多个集合的交汇的公共部分

  差集:集合中除去和其他集合的公共部分

  

集合运算

  并集:将两个集合元素合并在一起,组成一个新的集合,称之为A与B的并集

  union(*other):返回和多个集合合并后的新的集合,运算符为 | 

  update(*other):和多个集合合并,就地修改,运算符为 |= 

 

s1 = set(range(5))

s2 = set(range(3,7))

n = s1.union(s2)   #等价于 n = s1 | s2 

#{0, 1, 2, 3, 4, 5, 6} 

 

s1 |= s2

s1.update(s2)

s1 = s1 | s2

以上三个等价,都是就地修改.

 

  交集:集合A和B,相交,两个集合公共的部分组成的集合

  intersection(*other):返回和多个集合的交集,& 运算符表示,等同于intersection;

  intersection_update(*other):获取多个集合的交集,并就地修改 &=   

 

 

   差集:集合A和B,由所有属于A且不属于B的元素组成的集合

  difference(*other):返回和多个集合的差集,- 运算符表示

  difference_update(*other):就地修改 -= 

 

 

  对称差集:

  集合A和B,由所有不属于A和B的交集元素组成的集合,(A -B) U (B - A)

  symmetric_difference(other):返回和另一个集合的对称差集 ^ 运算符表示

  symmetric_difference_update(other): 就地修改  ^=  

  

 

   如上图示:对称差集则为阴影部分的面积

 

 

集合运算

  issubset(other) <=:判断当前集合是否是另一个集合的子集

    set1 < set2 :则判断s1是s2的真子集

  issupersubset(other) >=:判断当前集合是否是other的超集

    set1 > set2:判断set1是否是set2的真超集 

  isdisjoint(other):当前集合和另一个集合没有交集,没有交集,返回True. 

 

 

 

 

习题地址:

https://www.cnblogs.com/alrenn/p/12620500.html 

 

posted @ 2020-04-01 09:52  Alrenn  阅读(291)  评论(0)    收藏  举报