集合: 无序的, 不可随机访问的, 不可重复的集合
集合分为可变集合和不可变集合
定义
- 可变集合定义方式:
{元素1, 元素2...}
s = {1, 2, 3}
-
set(iterable)
: 其中iterable
可以是字符串、列表、元组、字典等
# iterable是字符串时 s = set("abc") print(s) # 打印: {'a', 'b', 'c'}
# iterable是数组时 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'}
- 集合推导式:
set(表达式 for循环 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是数组时 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'})
- 集合推导式:
frozenset(表达式 for循环 if语句)
,if语句
可以省略
s = frozenset(x**2 for x in range(10) if x % 2 == 0) print(s) # 打印: frozenset({0, 64, 4, 36, 16})
-
注意:
- 创建一个空集合时, 需要使用set() 或者 frozenset(), 不能使用 s = {}, 会被识别成为字典
- 集合中的元素, 必须是可哈希的值
- 如果集合中的元素值出现重复, 则会被合并为1个
集合的常用操作
- 可变集合:
- 增
-
s.add(element)
:element
为集合元素
s = {1, 2} s.add(3) print(s) # 打印: {1, 2, 3}
-
- 删
-
s.remove(element)
: 删除指定元素, 当集合不包含该元素时报错, 没有返回值
# 正常删除 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
: 循环遍历, 打印元素是随机的
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)
: 返回两个集合的交集, 并且不改变任何一个集合
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
-
注意: 可变与不可变集合混合运算, 返回结果类型以运算符左侧为主