1、第5章 集合1本章学习目标 理解集合中元素不重复的特点 熟练掌握使用集合去除重复内容的用法 理解并熟练掌握集合运算 熟悉内置函数对集合的操作25.1 基本概念Python集合是无序的、可变的容器类对象,所有元素放在一对大括号中,元素之间使用逗号分隔,同一个集合内的每个元素都是唯一的,不允许重复。集合中只能包含数字、字符串、元组等不可变类型的数据,而不能包含列表、字典、集合等可变类型的数据,包含列表等可变类型数据的元组也不能作为集合的元素。集合中的元素是无序的,元素存储顺序和添加顺序并不一致。集合不支持使用下标直接访问特定位置上的元素,也不支持使用random中的choice()函数从集合中随机
2、选取元素,但支持使用random模块中的sample()函数随机选取部分元素。35.2 集合创建与删除 a=3,5#创建集合对象 x=3,5,2#集合中每个元素都必须是不可变的Traceback(most recent call last):File,line 1,in x=3,5,2TypeError:unhashable type:list45.2 集合创建与删除 set(0,1,2,3,0,1,2,3,7,8)#转换时自动去掉重复元素0,1,2,3,7,8 set(Hello world)#把字符串转换为集合,自动去除重复,d,r,o,w,l,H,e x=set()#空集合 set(1,
3、2),(3,)#只包含简单值的元组可以作为集合的元素(1,2),(3,)set(1,2),(3,),4)#集合不能作为集合的元素Traceback(most recent call last):File,line 1,in set(1,2),(3,),4)TypeError:unhashable type:set55.3 集合常用操作与运算 元素增加与删除 集合运算 内置函数对集合的操作65.3.1 集合元素增加与删除(1)add()方法 s=20,30,50 s#自动调整顺序,不需要关心这一点50,20,30 s.add(40)s40,50,20,30 s.add(25)#自动调整顺序 s4
4、0,50,20,25,30 s.add(25)#集合中已经有25,该操作被忽略 s40,50,20,25,30 s.update(30,70)#自动忽略重复的元素 s70,40,50,20,25,3075.3.1 集合元素增加与删除(2)pop()、remove()、discard()s.discard(50)#删除50 s70,40,20,25,30 s.discard(3)#集合中没有3,该操作被忽略 s70,40,20,25,30 s.remove(3)#使用remove()方法会抛出异常Traceback(most recent call last):File,line 1,in s.
5、remove(3)KeyError:3 s.pop()#随机弹出并删除一个元素70 s40,20,25,3085.3.2 集合运算 a_set=set(8,9,10,11,12,13)b_set=0,1,2,3,7,8 a_set|b_set#并集,返回新集合#自动忽略重复元素0,1,2,3,7,8,9,10,11,12,13 a_set&b_set#交集8 a_set-b_set#差集9,10,11,12,13 a_set b_set#对称差集0,1,2,3,7,9,10,11,12,1395.3.2 集合运算 1,2,3 1,3,2 1,2,5 1,2,4#第二个集合不是第一个集合的子集F
6、alse105.3.3 内置函数对集合的操作 x=1,8,30,2,5 x#集合元素的存储顺序和写入顺序不一样1,2,5,8,30 len(x)#返回元素个数5 max(x)#返回最大值30 sum(x)#所有元素之和46 sorted(x)#内置函数sorted()总是返回列表1,2,5,8,30 list(map(str,x)1,2,5,8,30115.3.3 内置函数对集合的操作 list(filter(lambda item:item%5=0,x)#支持filter()函数,保留能被5整除的数5,30 list(enumerate(x)#支持enumerate()函数(0,1),(1,
7、2),(2,5),(3,8),(4,30)all(x)#检查是否所有元素都等价于TrueTrue any(x)#检查是否有元素等价于TrueTrue list(zip(x)#支持zip()函数(1,),(2,),(5,),(8,),(30,)list(reversed(x)#不支持reversed()函数Traceback(most recent call last):File,line 1,in list(reversed(x)TypeError:set object is not reversible125.4 集合应用案例例例5-1 过滤书评,如果一条书评中重复的字超过一定比例就认为无效
8、。comments=这是一本非常好的书,作者用心了,作者大大辛苦了,好书,感谢作者提供了这么多的好案例,书在运输的路上破损了,我好悲伤。,为啥我买的书上有菜汤。,啊啊啊啊啊啊,我怎么才发现这么好的书啊,相见恨晚,好好好好好好好好好好好,虽然读起来比较轻松,但还是自己运行一下代码理解更深刻,书的内容很充实,你的书上好多代码啊,不过想想也是,编程的书嘛,肯定代码多一些,书很不错!一级棒!买书就上当当,正版,价格又实惠,让人放心!,无意中来到你小铺就淘到心意的宝贝,心情不错!,送给朋友的、很不错,这真是一本好书,讲解内容深入浅出又清晰明了,强烈推荐。135.4 集合应用案例#定义过滤规则,如果不重复
9、的字超过70%才认为有效rule=lambda s:len(set(s)/len(s)0.7#使用内置函数filter()对书评进行过滤result=filter(rule,comments)print(过滤后的书评:)for comment in result:print(comment)145.4 集合应用案例例例5-2 使用集合实现筛选法求解不大于指定自然数的所有素数。n=int(input(请输入一个自然数:)#生成指定范围的候选整数,使用集合存储numbers=set(range(2,n)#最大数的平方根m=int(n*0.5)+1#遍历最大整数平方根之内的自然数for p in r
10、ange(2,m):for i in range(2,n/p+1):#在集合中删除数字p的所有倍数 numbers.discard(i*p)print(numbers)155.4 集合应用案例例例5-3 统计给定字符串中每个字符的出现次数,要求使用集合。from string import digitsfrom random import choices#生成包含100个随机数字的字符串#join()是字符串的方法,用于把多个字符串连接成为更长的字符串text=.join(choices(digits,k=100)#转换为集合,只保留唯一字符uniqueCharacters=set(text)#统计每个唯一字符的出现次数,count()是字符串方法for ch in uniqueCharacters:print(ch,text.count(ch),sep=:)16