Python基礎08-數據類型:集合set

目錄

集合的概念

集合的方法

集合可變嗎?


集合的概念

先理解一些概念。

數據類型按照是否可變分爲可變類型、不可變類型。按照訪問方式可以分爲順序訪問、映射訪問。

如何區分可變類型、不可變類型?就看在內存中存儲內容是否可以被修改。如果內存地址不變,內容可以修改,那麼就是可變類型。如果內存地址變化,重新分配了內存,再在新分配內存裏面存入修改後的內容,那麼就是不可變類型。

可變的數據類型有:列表、字典。

不可變的數據類型有:數字、字符串、元組。

數據類型按照訪問方式可以分爲順序訪問、映射訪問。

順序訪問的數據類型有:字符串、元組、列表。

映射訪問的數據類型有:字典。

# 不可變的數據類型,同一個變量名,修改內容後內存地址發生變化
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")

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章