集合:无序的,不可随机访问的,不可重复的元素集合
# 可以使用大括号 { } 或者 set() 函数创建集合,
# 注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
# 集合可分为可变集合和不可变集合
# 可变集合:有增、删、改的操作 set
# 不可变集合:创建好以后,无法进行增、删、改的操作 frozenset
# 可变集合定义
1 s = {1, 2, 3}
2 print(s, type(s))
3
4
5 # set(iterable)
6
7 # s = set("abc")
8 # s = set([1, 2, 3])
9 # s = set({1, 2, 3})
10 s = set({"name": "xq", "age": 18})
11 print(s, type(s))
输出结果:
{1, 2, 3} <class 'set'>
{'age', 'name'} <class 'set'>
# 集合推导式
1 s = set(x**2 for x in range(1, 10) if x % 2 == 0)
2 # 或者s = {x**2 for x in range(1, 10) if x % 2 == 0} 这样写也是可以的
3 print(s, type(s))
输出结果:
{16, 64, 4, 36} <class 'set'>
# 不可变集合的定义
# fs = frozenset(iterable) iterable:可迭代对象
1 # fs = frozenset("abcd")
2 # fs = frozenset([1, 2, 3])
3 fs = frozenset((1, 2, 3))
4 # s = frozenset({"name": "xq", "age": 18})
5 print(fs, type(fs))
输出结果:
frozenset({1, 2, 3}) <class 'frozenset'>
# 集合推导式
#fs = frozenset(...)
1 fs = frozenset(x for x in range(1, 10))
2 print(fs, type(fs))
输出结果:
frozenset({1, 2, 3, 4, 5, 6, 7, 8, 9}) <class 'frozenset'>
# 集合的常用操作
# 单一集合的操作
# 可变集合的操作:增、删、查 不可改:因为元素都是不可变类型,不可修改,而且也无法通过索引或者key进行查询
# 不可变集合:不可增、删、改。可以查询。1)通过for in进行访问 2)通过迭代器进行访问
# 1)添加元素
# s.add( x )
# 将元素 x 添加到集合 s 中,如果元素已存在,则不进行任何操作。
1 s = set({"Google", "Baidu"})
2 s.add("FaceBook")
3 print(s, type(s))
输出结果:
{'Google', 'Baidu', 'FaceBook'} <class 'set'>
# 2)移除元素
# s.remove( x )
# 将元素 x 从集合 s 中移除,如果元素不存在,则会发生错误。
1 s = {"Google", "Baidu", "FaceBook"}
2 s.remove("Baidu")
3 print("移除元素后的集合为:: ", s)
输出结果:
移除元素后的集合为:: {'Google', 'FaceBook'}
# s.remove("Taobao")
# 如果元素不存在则报以下的错误
'''
Traceback (most recent call last):
File "G:/PythonProject/DemoTest01/css/004/Set/SetFunction.py", line 65, in <module>
s.remove("Taobao")
KeyError: 'Taobao'
'''
# 此外还有一个方法也是移除集合中的元素,且如果元素不存在,不会发生错误。格式如下所示:
# s.discard( x )
1 s = {1, 2, 3, 4}
2 s.discard(2)
3 print("移除元素2之后的集合为:: ", s)
4
5 s.discard(5)
6 # 不存在不会发生错误
输出结果:
移除元素2之后的集合为:: {1, 3, 4}
# 我们也可以设置随机删除集合中的一个元素,语法格式如下:
# s.pop()
# 若集合为空,则会返回一个错误
1 s = {"name", "age", "sex"}
2 result = s.pop()
3 print("result:: ", result, " s:: ", s)
输出结果:result:: age s:: {'name', 'sex'}
# 清空集合
# s.clear()
1 s = {"Google", "Baidu", "Taobao"}
2 s.clear()
3 print("清空集合后:: ", s)
输出结果:清空集合后:: set()
# 3)查询操作
# for in 操作
1 s = {1, 2, 3}
2 for v in s:
3 print(v)
输出结果:
1
2
3
# 使用迭代器
1 s = {"name", "age", "sex"}
2 its = iter(s)
3 while True:
4 try:
5 x = next(its)
6 print(x)
7 except StopIteration:
8 break
输出结果:
age
name
sex
# 不可变集合和可变集合的查询操作几乎是一样的
1 s = frozenset([1, 2, 3])
2 print(s, type(s))
3 for v in s:
4 print(v)
5
6 its = iter(s)
7 for x in its:
8 print(x)
输出结果:
frozenset({1, 2, 3}) <class 'frozenset'>
1
2
3
1
2
3
# 集合之间的操作
# 交集、并集、差集和判定的操作
# 1)交集
# intersection(interable)
# 字符串 (只判定字符串中的非数字)
# 列表
# 元组
# 字典 值判定key
# 集合
1 s1 = {1, 2, 3, 4, 5}
2 s2 = {4, 5, 6}
3 result = s1.intersection(s2)
4 print(result, type(result))
输出结果:{4, 5} <class 'set'>
# 可变集合与不可变集合混合运算的时候,返回结果类型以运算符左侧为准
1 s1 = frozenset([1, 2, 3, 4, 7])
2 s2 = {4, 5, 6, 7}
3 result = s1.intersection(s2)
4 print(result, type(result))
5
6 ret = s2.intersection(s1)
7 print(ret, type(ret))
输出结果:
frozenset({4, 7}) <class 'frozenset'>
{4, 7} <class 'set'>
# 也可以使用逻辑"&"求出交集
1 s1 = frozenset([1, 2, 3, 4, 7]) 2 s2 = {4, 5, 6, 7} 3 result = s1 & s2 4 print(result, type(result)) 5 print(s1, s2)
输出结果:
frozenset({4, 7}) <class 'frozenset'>
frozenset({1, 2, 3, 4, 7}) {4, 5, 6, 7}
# intersection_update(...)
# 也是计算两个集合之间的交集,但是,交集计算完毕以后,会再次赋值给原对象
# 会更改原对象,所以只适用于可变集合
1 s1 = frozenset([1, 2, 3, 4, 7])
2 s2 = {4, 5, 6, 7}
3 # result = s1.intersection_update(s2) 这样写是错误的,因为s1是不可变集合
4 result = s2.intersection_update(s1)
5 print(result, type(result))
6 print(s1, s2)
输出结果:
None <class 'NoneType'>
frozenset({1, 2, 3, 4, 7}) {4, 7}
# 集合的并集操作
# union 返回并集
# 逻辑 "|" 返回并集
# update 更新并集
1 s1 = {1, 2, 3}
2 s2 = {3, 4, 5}
3
4 result = s1.union(s2)
5 print(result, s1)
6 # 使用 "|"
7 result1 = s1 | s2
8 print(result1, s1)
输出结果:
{1, 2, 3, 4, 5} {1, 2, 3}
{1, 2, 3, 4, 5} {1, 2, 3}
# 如果把s1更改为不可变集合
1 s1 = frozenset([1, 2, 3])
2 s2 = {3, 4, 5}
3
4 result2 = s1.union(s2)
5 print(result2, s1)
输出结果:
frozenset({1, 2, 3, 4, 5}) frozenset({1, 2, 3})
# 更新并集
1 s1 = {1, 2, 3}
2 s2 = {3, 4, 5}
3
4 result = s1.update(s2)
5 print(result, s1)
输出结果:None {1, 2, 3, 4, 5}
# 集合的差集操作
# difference()
# 逻辑运算符 "-"
# difference_update()
1 s1 = {1, 2, 3}
2 s2 = {3, 4, 5}
3
4 result = s1.difference(s2)
5 print(result, s1)
6
7 # 逻辑运算符"-"
8 result2 = s1 - s2
9 print(result2, s1)
10
11 # 更新差集
12 s1 = {1, 2, 3}
13 s2 = {3, 4, 5}
14
15 result = s1.difference_update(s2)
16 print(result, s1)
输出结果:
{1, 2} {1, 2, 3}
{1, 2} {1, 2, 3}
None {1, 2}
# 集合的判定操作
# isdisjoint() 两个集合不相交
# issuperset() 一个集合包含另一个集合
# issubset() 一个集合包含于另一个集合
1 s1 = {1, 2, 3}
2 s2 = {3, 4, 5}
3 print(s1.isdisjoint(s2))
4
5 s1 = {1, 2}
6 s2 = {3, 4, 5}
7 print(s1.isdisjoint(s2))
8
9
10 s1 = {1, 2, 3, 4}
11 s2 = {3, 4, 5}
12 print(s1.issuperset(s2))
13
14 s1 = {1, 2, 3, 4, 5}
15 s2 = {3, 4, 5}
16 print(s1.issuperset(s2))
17
18
19 print(s2.issubset(s1))
输出结果:
False
True
False
True
True