Python内置数据结构Set

集set

约定:

  set翻译为集合
  collection翻译为集合类型,是一个大概念
  可变的、无序的、不重复的元素的集合!!!!******

集合必须有元素否则是字典
s = {1,2,3}
如果想要空集合只能是这样
s = set()

set定义、初始化:

  set()->new empty set object
  set(iterable)->new set object

s1=set()
s2=set(range(5)) #{0,1,2,3,4}
s3=set(list(range(10)))  #从列表转换成字典
s4={} #这个是字典
s5={9,10,11} #set
s6={(1,2),3,'a'} 
s7={[1],(1,),1} #集合里的元素必须可以哈希,list、bytearray不可以哈希

set的元素:

  set的元素要求必须可以hash
  目前学过的不可hash的类型有list、set、bytearray
  元素不可以索引
  set可以迭代

set增加:

add(elem):
  增加一个元素到set中
  如果元素存在,则不添加

a = set(map(str,range(5)))
print(a)
a.add('abc')
print(a)
a.add(0) #0与之前集合里面的'0'不是同类型所以可以添加
print(a)
{'1', '3', '2', '0', '4'}
{'1', '3', '2', 'abc', '0', '4'}
{0, '1', '3', '2', 'abc', '0', '4'}

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

a.update(range(5),range(3,7))
print(a)
{0, 1, 2, 3, 4, '1', 5, 6, '3', '2', 'abc', '0', '4'}
======================================================================
a = set()
a.update(range(10))
a.add('abc')
{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 'abc'}

set删除

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

a = set()
a.update(range(10))
a.add('abc')
a.remove(10)
---------------------------------------------------------------------------
KeyError

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

a = set()
a.update(range(10))
a.add('abc')
a.discard(3)
0, 1, 2, 4, 5, 6, 7, 8, 9, 'abc'}
a.discard(10)
{0, 1, 2, 4, 5, 6, 7, 8, 9, 'abc'}

pop()->item
  移除并返回任意的元素,为什么是任意元素,因为他无序
  空集返回KeyError异常

a = set()
a.update(range(10))
a.add('abc')
a.pop()
0
a
{1, 2, 3, 4, 5, 6, 7, 8, 9, 'abc'}

clear()
  移除所有元素

a.clear()
a
set()

set修改、查询:

  修改
    要么删除,要么加入新的元素
    为什么没有修改 因为set中没有重复的元素
  查询
    非线性结构,无法索引
  遍历
    可以迭代所有元素

成员运算符:

  in和not in 判断元素是否在set中

  时间复杂度O(1)

set和线性结构:

  线性结构的查询时间复杂度是O(n),即随着数据规模的增大而增加耗时
  set、dict等结构,内部使用hash值作为key,时间复杂度可以做到O(1),查询时间和数据规模无关

  可hash
    数值型int、float、complex
    布尔型True、False
    字符串string、bytes
    tuple
    None
  以上都是不可变类型,成为可哈希类型,hashable

  • set的元素必须是可hash的

集合:

基本概念:
全集:
    所有元素的集合。例如实数集,所有实数组成的集合就是全集
子集subset和超级suoerset
    一个集合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和B,由所有属于A且属于B的元素组成的集合

intersection(*others)
    返回和多个集合的交集
&
    等同intersection
    intersection_update(*others)
    获取和多个集合的交集,并就地修改
&=
    等同intersection_update

差集:

集合A和B,由所有属于A且不属于B的元素组成的集合
differenct(*others)
    返回和多个集合的差集
-
    等同difference
differenct_update(*others)
    获取和多个集合的差集并就地修改
-=
    等同intersection_update

对称差集:

集合A和B,由所有不属于A和B的交集元素组成组成的集合,记作(A-B)U(B-A)
symmetric_differece(other)
    返回和另一个集合的差集
^
    等同symmetric_differece
    symmetric_differece_update(other)
    获取和另一个集合的差集并就地修改
^=
    等同symmetric_differece_update

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

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

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

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

猜你喜欢

转载自blog.csdn.net/qq_35976427/article/details/88999896