集合: 無序的, 不可隨機訪問的, 不可重復(fù)的集合
集合分為可變集合和不可變集合
定義
- 可變集合定義方式:
{元素1, 元素2...}
s = {1, 2, 3}
-
set(iterable)
: 其中iterable
可以是字符串卢鹦、列表冀自、元組、字典等
# iterable是字符串時 s = set("abc") print(s) # 打印: {'a', 'b', 'c'}
# iterable是數(shù)組時 s = set([1, 2, 3]) print(s) # 打印: {1, 2, 3}
# iterable是元組時 s = set((1, 2, 3, "a", "b", "c")) print(s) # 打印: {1, 2, 3, 'c', 'b', 'a'}
# iterable是字典時, 取key值做為集合元素 s = set({"name":"zhangsan", "age": 18}) print(s) # 打印: {'name', 'age'}
- 集合推導(dǎo)式:
set(表達式 for循環(huán) if語句)
,if語句可以省略
s = set(x**2 for x in range(10) if x % 2 == 0) print(s) # 打印: {0, 64, 4, 36, 16}
- 不可變集合定義方式:
-
fs = frozenset(iterable)
: 其中iterable
可以是字符串搀玖、列表巷怜、元組暴氏、字典等
# iterable是字符串時 s = frozenset("abc") print(s) # 打印: frozenset({'a', 'b', 'c'})
# iterable是數(shù)組時 s = frozenset([1, 2, 3]) print(s) # 打印: frozenset({1, 2, 3})
# iterable是元組時 s = frozenset((1, 2, 3, "a", "b", "c")) print(s) # 打印: frozenset({1, 2, 3, 'b', 'a', 'c'})
# iterable是字典時, 取key值做為集合元素 s = frozenset({"name":"zhangsan", "age": 18}) print(s) # 打印: frozenset({'age', 'name'})
- 集合推導(dǎo)式:
frozenset(表達式 for循環(huán) if語句)
,if語句
可以省略
s = frozenset(x**2 for x in range(10) if x % 2 == 0) print(s) # 打印: frozenset({0, 64, 4, 36, 16})
-
注意:
- 創(chuàng)建一個空集合時, 需要使用set() 或者 frozenset(), 不能使用 s = {}, 會被識別成為字典
- 集合中的元素, 必須是可哈希的值
- 如果集合中的元素值出現(xiàn)重復(fù), 則會被合并為1個
集合的常用操作
- 可變集合:
- 增
-
s.add(element)
:element
為集合元素
s = {1, 2} s.add(3) print(s) # 打印: {1, 2, 3}
-
- 刪
-
s.remove(element)
: 刪除指定元素, 當(dāng)集合不包含該元素時報錯, 沒有返回值
# 正常刪除 s = {1, 2, 3} s.remove(2) print(s) # 打印: {1, 3}
# 刪除不存在的元素, 報錯 s = {1, 2, 3} s.remove(5) # 報錯: KeyError: 5
-
s.discard(element)
: 刪除指定元素, 元素不存在時什么也不做, 沒有返回值
# 正常刪除 s = {1, 2, 3} s.discard(2) print(s) # 打印: {1, 3}
# 刪除不存在的元素什么也不做 s = {1, 2, 3} s.discard(5) print(s) # 打印: {1, 3}
-
s.pop()
: 隨機刪除一個元素, 集合為空時報錯, 有返回值
# 正常刪除 s = {1, 2, 3} result = s.pop() print(result, s) # 打印: 1 {2, 3}
# 元素為空時報錯 s = set() s.pop() # 報錯: KeyError: 'pop from an empty set'
-
s.clear()
: 清空所有元素
s = {1, 2, 3} s.clear() print(s) # 打印: set()
-
- 改: 可變集合中的元素是不可以進行修改的
- 查: 因為集合元素的位置隨機, 并且沒有
key
, 所以不能通過索引和key
值查詢-
for in
: 循環(huán)遍歷, 打印元素是隨機的
s = {1, 2, "a", 4, "b", 5, "c", 6} for element in s: print(element, end=" ") # 打印: 1 2 4 5 c 6 b a
- 迭代器遍歷
-
- 增
- 不可變集合: 只能進行查詢操作, 與可變集合查詢方式相同
集合之間可以進行操作: 交集, 并集, 差集, 判定
- 交集
-
s1.intersection(s2)
: 返回兩個集合的交集, 并且不改變?nèi)魏我粋€集合
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1.intersection(s2) print(result, s1, s2) # 打印: {3} {1, 2, 3} {3, 4, 5}
- 可以使用邏輯與
&
進行省略寫法
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1 & s2 print(result, s1, s2) # 打印: {3} {1, 2, 3} {3, 4, 5}
-
s1.intersection_update(s2)
: 獲取兩個集合的交集,s1
改變, 沒有返回值
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1.intersection_update(s2) print(result, s1, s2) # 打印: None {3} {3, 4, 5}
-
- 并集:
-
s1.union(s2)
: 返回兩個集合的并集, 兩個集合不改變
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1.union(s2) print(result, s1, s2) # 打印: {1, 2, 3, 4, 5} {1, 2, 3} {3, 4, 5}
- 可以使用邏輯或
|
進行簡略寫法
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1 | s2 print(result, s1, s2) # 打印: {1, 2, 3, 4, 5} {1, 2, 3} {3, 4, 5}
-
s1.update(s2)
: 獲取兩個集合的并集, 改變s1
, 沒有返回值
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1.update(s2) print(result, s1, s2) # 打印: None {1, 2, 3, 4, 5} {3, 4, 5}
-
- 差集
-
s1.difference(s2)
: 返回s1
相對于s2
的差集, 原集合不變
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1.difference(s2) print(result, s1, s2) # 打印: {1, 2} {1, 2, 3} {3, 4, 5}
- 可以使用運算符
-
進行省略寫法
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1 - s2 print(result, s1, s2) # 打印: {1, 2} {1, 2, 3} {3, 4, 5}
-
s1.difference_update(s2)
, 獲取s1
相對于s2
的差集,s1
改變, 沒有返回值
s1 = {1, 2, 3} s2 = {3, 4, 5} result = s1.difference_update(s2) print(result, s1, s2) # 打印: None {1, 2} {3, 4, 5}
-
- 判定:
-
s1.isdisjoint(s2)
: 兩個集合不相交
s1 = {1, 2, 3} s2 = {2, 3, 4} result = s1.isdisjoint(s2) print(result) # 打印: False
s1 = {1, 2, 3, 4} s2 = {2, 3, 4} result = s1.isdisjoint(s2) print(result) # 打印: True
-
s1.issuperset(s2)
: s1包含s2:
s1 = {1, 2, 3} s2 = {2, 3, 4} result = s1.issuperset(s2) print(result) # 打印: False
s1 = {1, 2, 3, 4} s2 = {2, 3, 4} result = s1.issuperset(s2) print(result) # 打印: True
-
s1.issubset(s2)
: s1包含于s2, 即: s2包含s1
s1 = {1, 2, 3} s2 = {2, 3, 4} result = s1.issubset(s2) print(result) # 打印: False
s1 = {1, 2, 3} s2 = {1, 2, 3, 4} result = s1.issubset(s2) print(result) # 打印: True
-
注意: 可變與不可變集合混合運算, 返回結(jié)果類型以運算符左側(cè)為主