Python Set 集合

Python Set

Posted by BlueFat on Tuesday, August 9, 2022

集合Set

Python中,它是可变的、无序的、不重复的元素的集合

初始化

set( ) set(iterable)

s1=set( )
s2=set(range(5))
s3=set([1,2,3])
s4=set('abcd')

注意:

s5={ } #是字典不是集合
s6={1,2,3}
s7={1,(1,)}
s8=(1,(1,),[1]} #报错

元素性质

  • 去重:在集合中,所有元素必须是唯一的
  • 无序: 因为无序,所以不可索引
  • 可哈希:Python集合中的元素必须是可hash,即元素都可以使用内置hash函数
    • 可hash类型:
      • 数值型int、float、complex
      • 布尔型True、False
      • 字符串String、bytes
      • tuple
      • None
    • 不可hash的类型:
      • list
      • set
      • bytearry
  • 可迭代: set中元素虽然不一样,但元素可以迭代出来

增加

  • add( )
    • 如果元素存在则不操作
  • update(*others)
    • 合并其他元素到set集合中
    • 参数other必须是迭代对你
    • 就地修改

移除

  • remove( ) 移除元素,不存在会报错 KeyError

  • discard( ) 移除元素,不存在不操作

  • pop( ) 移除并返回任意的元素,空集返回KeyError异常

  • clear( ) 移除所有元素

不可修改

集合类型没有修改。因为元素唯一。

不可索引

非线性结构,不可索引

遍历

可遍历,效率O(n)

列表和集合搜索效率

  • 列表为线性数据结构,搜索元素的时间复杂度是O(n),即随数据规模增加耗时增大
  • set、dict使用hash表实现,内部使用hash值作为key,时间复杂度是O(1),查询时间和数据规模无关,不会数据规模增大而搜索性能下降

集合概念

  • 全集
    • 所有元素的集合。
  • 子集subset和超集superset
    • 一个集合A所有元素都在另一个集合B中,A是B的子集,B是A是超集
  • 真子集和真超集
    • A是B的子集,且A不等于B, A就是B的真子集,B是A的真超集
  • 并集:多个集合合并的结果
  • 交集:多个集合的公共部分
  • 差集:集合中除去和其他集合公共部分

并集

将两个集合A和B的所有元素合并在一起,组成的集合称为集合A和集合B的并集

  • union(*others) 返回和多个集合合并后的新集合
  • | 运算符重载,等同union
  • update(*others)和多个集合合并,就地修改
  • |= 等同update
>>> a={1,2,3}
>>> b={2,3,4,5}
>>> print(a.union(b))
{1, 2, 3, 4, 5}
>>> print(a|b)
{1, 2, 3, 4, 5}

交集

集合A和B公共部分

  • intersection(*others) 返回和多个集合的交集
  • & 等同intersection
  • intersection_update(others) 获取和多个集合的交集,并就地修改
  • &= 等同intersection_update
>>> a={1,2,3}
>>> b={2,3,4,5}
>>> print(a&b)
{2, 3}

差集

集合A和B, A-B 属于A且不属于B的元素组成的集合,即A中去掉与B相同元素。

  • difference(*others) 返回和多个集合的差集
  • & 等同difference
  • difference_update(others) 获取和多个集合的差集,并就地修改
  • -= 等同difference_update
>>> a={1,2,3}
>>> b={2,3,4,5}
>>> print(a-b)
{1}

对称差集

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

  • symmetric_differece(*others) 返回和多个集合的差集
  • ^ 等同symmetric_differece
  • symmetric_differece_update(others) 获取和另一个集合的对称差集,并就地修改
  • ^= 等同symmetric_differece_update
>>> print(a^b)
>>> a={1,2,3}
>>> b={2,3,4,5}
{1, 4, 5}

其他集合运算

  • issubset(other)、<=判断当前集合是否是另一个集合的子集
  • set1 < set2 判断set1是否是set2的真子集
  • issuperset(other)、>=判断当前集合是否是other的超集
  • set1 > set2 判断set1是否是set2的真超集
  • isdisjoint(other)当前集合和另一个集合没有交集,没有交集,返回True