目录
集合的概念
集合的方法
集合可变吗?
集合的概念
先理解一些概念。
数据类型按照是否可变分为可变类型、不可变类型。按照访问方式可以分为顺序访问、映射访问。
如何区分可变类型、不可变类型?就看在内存中存储内容是否可以被修改。如果内存地址不变,内容可以修改,那么就是可变类型。如果内存地址变化,重新分配了内存,再在新分配内存里面存入修改后的内容,那么就是不可变类型。
可变的数据类型有:列表、字典。
不可变的数据类型有:数字、字符串、元组。
数据类型按照访问方式可以分为顺序访问、映射访问。
顺序访问的数据类型有:字符串、元组、列表。
映射访问的数据类型有:字典。
# 不可变的数据类型,同一个变量名,修改内容后内存地址发生变化
i = 1
print(i, id(i))
i = 2
print(i, id(i))s = "oracle"
print(s, id(s))
s = "mysql"
print(s, id(s))t = (1, 0,)
print(t, id(t))
t = (-2, 3)
print(t, id(t))# 可变的数据类型,同一个变量名,修改内容后内存地址不变
li = [11, 22]
print(li, id(li))
li.append(33)
print(li, id(li))d = {"db": "mysql", "storage": "iscsi"}
print(d, id(d))
d["db"] = "oracle"
print(d, id(d))# 1 8791481095840
# 2 8791481095872
# oracle 31318384
# mysql 31318512
# (1, 0) 31315392
# (-2, 3) 38789824
# [11, 22] 38739840
# [11, 22, 33] 38739840
# {'db': 'mysql', 'storage': 'iscsi'} 31252160
# {'db': 'oracle', 'storage': 'iscsi'} 31252160
再来说集合的概念。集合是用{}将元素括起来的数据类型。集合的元素是不同的、集合的元素是无序的、集合的元素必须是不可变的数据类型。
# 集合s只有4个元素
s = set("hello")
print(s)
# 并没有顺序
# {'o', 'l', 'h', 'e'}
集合的方法
集合的删除方法有pop、remove、discard。
s = {"mysql", 1, "oracle", 3, 4, 5, 6}
print(s)# 随机删除一个元素,
s.pop()
print(s)# 删除指定元素,如果元素不存在会报错
s.remove("mysql")
print(s)# 删除指定元素,如果元素不存在什么也不做
s.discard("db2")
print(s)
集合的交集intersection、并集union、差集difference、交叉补集symmetric_difference。定义和数学上集合的交集、并集、差集、交叉补集是一样的,也可以用四种符号来计算分别是&、|、-、^。
s1 = {"mysql", "oracle", "sqlserver"}
s2 = {"mysql", "db2", "oracle"}# 交集 {'mysql', 'oracle'}
print(s1.intersection(s2))
print(s1 & s2)# 并集 {'db2', 'mysql', 'sqlserver', 'oracle'}
print(s1.union(s2))
print(s1 | s2)# 差集
# {'sqlserver'}
print(s1.difference(s2))
print(s1 - s2)
# {'db2'}
print(s2.difference(s1))
print(s2 - s1)#交叉补集 {'sqlserver', 'db2'}
print(s1.symmetric_difference(s2))
print(s1 ^ s2)
交集、并集、差集、交叉补集再update,那么就相当于将结果集赋值给原来的集合。
s1 = {"mysql", "oracle", "sqlserver"}
s2 = {"mysql", "db2", "oracle"}# 相当于 s1 = s1.intersection(s2)
s1.intersection_update(s2)# 相当于 s1 = s1.union(s2)
s1.update(s2)# 相当于 s1 = s1.difference(s2)
s1.difference_update(s2)# 相当 s1 = s1.symmetric_difference(s2)
s1.symmetric_difference_update(s2)
判断是否有交集、是超集、是子集。
s1 = {"oracle", "sqlserver"}
s2 = {"mysql", "db2"}
s3 = {"mysql"}# 判断没有交集时为True
print(s1.isdisjoint(s2)) # True
print(s2.isdisjoint(s3)) # False# 判断是超集、子集
print(s2.issubset(s2)) # True
print(s3.issubset(s2)) # True
print(s2.issuperset(s2)) # True
print(s2.issuperset(s3)) # True
集合可变吗?
集合本身是可变类型。
但是frozenset集合是不可变类型。这个集合不能增删元素。
s = frozenset("hello")