Python基础讲义(九):集合类型
集合类型
0x01内容导图

0x02集合的特点
- 无序,不可重复,可枚举,不可嵌套
- 使用花括号(空字典用“{}”表示,空集合要使用
set()的方式) - 集合对象本身可修改,但集合内的元素要求不可变
- 集合底层实现也使用了哈希技术,集合可以被立即为只有键的字典
- 简单示例
>>> s = {} #空字典
>>> sa = set() #空集合的正确表示
>>> sb = {1, 2, 3, 4}
>>> sc = {[1, 2], [3, 4]} #集合元素要求可哈希
Traceback (most recent call last):
File "<pyshell#68>", line 1, in <module>
sc = {[1, 2], [3, 4]}
TypeError: unhashable type: 'list'
>>> sc = {(1, 2), (3, 4)}
0x03集合的常用操作
-
集合运算
- 交集:& or intersection函数
- 并集:| or union函数
- 差集:- or difference函数
- 对称差:^ or symmetric_difference函数
- 上述运算产生新的结果集,交、差、对称差有原地运算版(函数名后有update),并集的原地版是update函数
![]()
- 子集/超集:<= or issubset函数,>= or issuperset函数
-
添加元素:add函数
-
删除元素:remove函数
-
是否相交判断:isdisjoint函数,不相交为True,相交为False
-
代码演示
>>> a = {1, 2, 3, 4, 5}
>>> b = {2, 4, 6, 8}
>>> a & b
{2, 4}
>>> a.union(b)
{1, 2, 3, 4, 5, 6, 8}
>>> a - b
{1, 3, 5}
>>> a ^ b
{1, 3, 5, 6, 8}
>>> a.symmetric_difference(b)
{1, 3, 5, 6, 8}
>>> c = a - b
>>> c.issubset(a)
True
>>> a.issuperset(c)
True
>>> 2 in a
True
>>> 8 in a
False
>>> a.isdisjoint(b)
False
#集合应用:去重
>>> >>> s = "asdfsgfjalfjaldfj"
>>> len(set(s))
7
>>> set(s)
{'f', 's', 'a', 'g', 'd', 'l', 'j'}
#集合修改
>>> a = set()
>>> a.add(3)
>>> a.add(5)
>>> a
{3, 5}
>>> a.remove(5)
>>> a
{3}
0x04高级内置函数
- sorted排序函数:对可迭代对象,默认生成新的升序列表
>>> ls = [8, 7, 9, 11, 5]
>>> sorted(ls) #生成新列表
[5, 7, 8, 9, 11]
>>> ls #原列表不变
[8, 7, 9, 11, 5]
>>> ls.sort() #列表本身的sort方法是原地排序,自身修改
>>> ls
[5, 7, 8, 9, 11]
>>> sorted(ls, reverse=True) #降序排列
[11, 9, 8, 7, 5]
- map映射函数:对可迭代对象每个函数执行映射操作
- filter过滤函数:按条件选取可迭代对象中的元素
#将标准输入的字符串分割成字符串列表,然后对列表中的每个串执行int转换
>>> nums = map(int, input().split())
12 5 10 8
>>> ls = list(nums) #Python3返回的是map对象,可以用list转换函数
>>> ls
[12, 5, 10, 8]
>>> " ".join(map(str, ls))
'12 5 10 8'
>>> even = filter(lambda x : x % 2 == 0, ls) #匿名函数后面介绍
>>> list(even)
[12, 10, 8]
- zip函数:将多个可迭代对象,按索引位置打包为元组,再由这些元组构成新列表返回
>>> ptx = [1, 2, 3] #x坐标列表
>>> pty = [2, 3, 4] #y坐标列表
>>> pts = list(zip(ptx, pty)) #形成平面坐标点集
>>> pts
[(1, 2), (2, 3), (3, 4)]
- max/min/sum函数:求最大值,最小值,求和
- all函数:所有条件都满足;any函数:满足一个即可
- enumerate(iter):迭代所有对象,并返回对象的索引号,即返回的是二元组(i, 对象)
ls = [19, 8, 7, 10]
for i, x in enumerate(ls):
print(f"{i}:{x}")
0:19
1:8
2:7
3:10
0x05小结
- 理解集合特点,熟悉集合使用场合
- 熟练掌握集合常用操作并能灵活应用
- 熟练掌握高级内置函数的使用

浙公网安备 33010602011771号