集合 set
集合 ( set ) 就像是“只有键,没有值”的字典,一个集合里所有的键都不会重复,因为集合不会包含重复的数据的特性,常用来进行去除重复的字元、或判断元素间是否有交集、联集或差集之类的关联性。
快速导览:建立集合、add() 加入项目、移除项目、交集、联集、差集、对称差集、 子集合、超集合、len() 取得长度、in 检查是否存在、复制字典
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
建立集合
集合由“数字、字串或布尔”所组成,同一个集合里的项目,可以是不同的型别,建立集合有两种方式:
set()
使用 set() 可以建立空集合,或将串列、tuple、字串或字典转换为集合,使用的方法为“
set(要變成集合的元素)”。如果建立时出现重复的项目,只会保留一个,如果是字典,只会保留键,如果是布尔,True 等同 1,False 等同 0。
a = set() b = set([1,2,3,4,5,1,2,3,4,5]) c = set({'x':1,'y':2,'z':3}) d = set('hello') print(a) # set() print(b) # {1, 2, 3, 4, 5} 只留下不重複的部分 print(c) # {'x', 'y', 'z'} 如果是字典,只保留鍵 print(d) # {'l', 'o', 'h', 'e'} 只留下不重複的部分大括号 {}
如果不是空集合,可以使用“
{項目}”建立集合 ( 单纯写大括号,会变成“空字典” )。a = {0,1,2,3,'a','b',False} print(a) # {0, 1, 2, 3, 'a', 'b'} False 等同於 0,所以只保留 0
add() 加入项目
使用“集合.add(項目)”可以将某个项目加入集合中,下面的程序会将 x 和 y 两个文字加入 a 集合。
a = {0,1,2,3,4,5}
a.add('x')
a.add('y')
print(a) # {0, 1, 2, 3, 4, 5, 'x', 'y'}
移除项目
有两种方法可以移除集合里的某个项目:
remove()
使用“
集合.remove(項目)”,可以将指定的项目移除,不过如果该项目不存在,就会执行错误。a = {0,1,2,3,'x','y','z'} a.remove('x') print(a) # {0, 1, 2, 3, 'y', 'z'}discard()
如果不希望在移除项目时发生执行错误的状况,可以使用“
集合.discard(項目)”,将指定项目移除a = {0,1,2,3,'x','y','z'} a.discard('x') a.discard('a') # 不會發生錯誤 print(a) # {0, 1, 2, 3, 'y', 'z'}
交集、联集、差集、对称差集
集合有四种运算型态,分别是“交集、联集、差集、对称差集”,透过下图可以了解四种运算型态。
使用集合运算有两种方法,一种是使用特定的方法,另外一种则是使用“符号”( 集合运算子 )
| 集合 | 方法 | 运算子 |
|---|---|---|
| 交集 | a.intersection(b) | a&b |
| 联集 | a.union(b) | a|b |
| 差集 | a.difference(b) | a-b |
| 对称差集 | a.symmetric_difference(b) | a^b |
下方的程序,会呈现进行 a 对 b 进行集合运算后的结果。
a = {1,2,3,4,5}
b = {3,4,5,6,7}
# 交集
print(a.intersection(b)) # {3, 4, 5}
print(a&b) # {3, 4, 5}
# 聯集
print(a.union(b)) # {1, 2, 3, 4, 5, 6, 7}
print(a|b) # {1, 2, 3, 4, 5, 6, 7}
# 差集
print(a.difference(b)) # {1, 2}
print(a-b) # {1, 2}
# 對稱差集
print(a.symmetric_difference(b)) # {1, 2, 6, 7}
print(a^b) # {1, 2, 6, 7}
子集合、超集合
假设有 A、B 两个集合,超集合和子集合的关系可以参考下图:
| 集合 | 说明 |
|---|---|
| 超集合 | A 完全包含 B,A 和 B 所包含的元素可能完全相同 |
| 真超集合 | A 完全包含 B,且具有 B 没有的的元素 |
| 子集合 | B 完全被 A 包含,A 和 B 所包含的元素可能完全相同 |
| 真子集合 | B 完全被 A 包含,且 A 具有 B 没有的的元素 |
下面的程序列出四个集合,使用“大于、小于、等于”可以呈现彼此的关系,从印出的结果可以看到各个集合之间的关系。
a = {1,2,3,4,5,6,7}
b = {3,4,5,6,7}
c = {1,2,3,4,5,6,7}
d = {6,7,8,9}
print(a<=a) # True 自己是自己的子集合
print(b<=a) # True b 是 a 的子集合
print(b<a) # True b 也是 a 的真子集合 ( 因爲沒有等於,完全包含 )
print(c<=a) # True c 是 a 的子集合
print(a<=c) # True a 也是 c 的子集合
print(d<a) # False d 和 a 沒有子集合或超集合關係
此外,使用“b.issubset(a)”方法可以检测 b 是否为 a 的子集合、“a.issuperset(b)”方法可以检测 a 是否为 b 的超集合。
a = {1,2,3,4,5,6,7}
b = {3,4,5,6,7}
c = {1,2,3,4,5,6,7}
d = {6,7,8,9}
print(b.issubset(a)) # True b 是 a 的子集合
print(a.issuperset(b)) # True a 是 b 的超集合
print(c.issubset(a)) # True c 是 a 的子集合
print(d.issubset(a)) # Fasle d 不是 a 的子集合
len() 取得长度
使用“len(集合)”可以回传某个集合的长度 ( 有几个元素 )。
a = {1,2,3,4,5,6,7}
print(len(a)) # 7
in 检查是否存在
使用“元素 in 集合”可以检查集合中是否存在某个元素,如果存在就是 True,不存在就是 False ( 使用“元素 not in 集合”可以判断不存在 )。
a = {'a','b','c','d',1,2,3}
print('b' in a) # True
print(2 in a) # True
print(99 in a) # False
微信扫码关注
抖音扫码关注