目錄
集合的概念
先理解一些概念。
數據類型按照是否可變分爲可變類型、不可變類型。按照訪問方式可以分爲順序訪問、映射訪問。
如何區分可變類型、不可變類型?就看在內存中存儲內容是否可以被修改。如果內存地址不變,內容可以修改,那麼就是可變類型。如果內存地址變化,重新分配了內存,再在新分配內存裏面存入修改後的內容,那麼就是不可變類型。
可變的數據類型有:列表、字典。
不可變的數據類型有:數字、字符串、元組。
數據類型按照訪問方式可以分爲順序訪問、映射訪問。
順序訪問的數據類型有:字符串、元組、列表。
映射訪問的數據類型有:字典。
# 不可變的數據類型,同一個變量名,修改內容後內存地址發生變化
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")