集合:在我的世界里,你就是唯一
本章内容:
1、集合的作用
2、创建集合
2.1去重复
3、访问集合
4、不可变集合
5、常用的方法
6、练习
7、作业
1、集合在python中几乎起到的所有作用就是两个字:唯一
集合是一个无序的,不重复的数据组合,它的主要作用如下:
- 去重,把一个列表变成集合,就自动去重了
- 关系测试,测试两组数据之前的交集、差集、并集等关系
num1 = {} print(type(num1)) # <class 'dict'> num2 = {1,2,3,4,5} print(type(num2)) # <class 'set'>
#去重复 num = {1,2,3,4,5,4,3,2,1} print(num) #去重 # {1, 2, 3, 4, 5} #集合是无序的,不要试图去索引集合的某一个元素 print(num[2]) # TypeError: 'set' object does not support indexing
#作用:去重,关系运算, #定义: 知识点回顾 可变类型是不可hash类型 不可变类型是可hash类型 #定义集合: 集合:可以包含多个元素,用逗号分割, 集合的元素遵循三个原则: 1:每个元素必须是不可变类型(可hash,可作为字典的key) 2:没有重复的元素 3:无序 注意集合的目的是将不同的值存放到一起,不同的集合间用来做关系运算,无需纠结于集合中单个值 #优先掌握的操作: #1、长度len #2、成员运算in和not in #3、|合集 #4、&交集 #5、-差集 #6、^对称差集 #7、== #8、父集:>,>= #9、子集:<,<=
2、创建集合
创建集合有两种方法:一是直接把一堆元素用大括号({})扩起来;二是用set()
#方式一 set1 = {"小甲鱼",'小鱿鱼','小护士','小甲鱼'} #方式二 set2 = set(["小甲鱼",'小鱿鱼','小护士','小甲鱼']) set1 = set2 # True print(set1) print(set2) #{'小甲鱼', '小鱿鱼', '小护士'} #{'小甲鱼', '小鱿鱼', '小护士'}
2.1去重复
#列表中去重 list1 = [1,2,3,4,5,5,3,1,0] temp = list1[:] list1.clear() for each in temp: if each not in list1: list1.append(each) print(list1) # [1, 2, 3, 4, 5, 0] #使用集合的方式 list1 = [1,2,3,4,5,5,3,1,0] list1 = list(set(list1)) print(list1) # [0, 1, 2, 3, 4, 5] #注意set() 是无序的,会改变原来的顺序,对顺序有要求的,慎用
二.去重 1. 有列表l=['a','b',1,'a','a'],列表元素均为可hash类型,去重,得到新列表,且新列表无需保持列表原来的顺序 2.在上题的基础上,保存列表原来的顺序 3.去除文件中重复的行,肯定要保持文件内容的顺序不变 4.有如下列表,列表元素为不可hash类型,去重,得到新列表,且新列表一定要保持列表原来的顺序 l=[ {'name':'egon','age':18,'sex':'male'}, {'name':'alex','age':73,'sex':'male'}, {'name':'egon','age':20,'sex':'female'}, {'name':'egon','age':18,'sex':'male'}, {'name':'egon','age':18,'sex':'male'}, ]
#去重,无需保持原来的顺序 l=['a','b',1,'a','a'] print(set(l)) #去重,并保持原来的顺序 #方法一:不用集合 l=[1,'a','b',1,'a'] l1=[] for i in l: if i not in l1: l1.append(i) print(l1) #方法二:借助集合 l1=[] s=set() for i in l: if i not in s: s.add(i) l1.append(i) print(l1) #同上方法二,去除文件中重复的行 import os with open('db.txt','r',encoding='utf-8') as read_f,\ open('.db.txt.swap','w',encoding='utf-8') as write_f: s=set() for line in read_f: if line not in s: s.add(line) write_f.write(line) os.remove('db.txt') os.rename('.db.txt.swap','db.txt') #列表中元素为可变类型时,去重,并且保持原来顺序 l=[ {'name':'egon','age':18,'sex':'male'}, {'name':'alex','age':73,'sex':'male'}, {'name':'egon','age':20,'sex':'female'}, {'name':'egon','age':18,'sex':'male'}, {'name':'egon','age':18,'sex':'male'}, ] # print(set(l)) #报错:unhashable type: 'dict' s=set() l1=[] for item in l: val=(item['name'],item['age'],item['sex']) if val not in s: s.add(val) l1.append(item) print(l1) #定义函数,既可以针对可以hash类型又可以针对不可hash类型 def func(items,key=None): s=set() for item in items: val=item if key is None else key(item) if val not in s: s.add(val) yield item print(list(func(l,key=lambda dic:(dic['name'],dic['age'],dic['sex']))))
3、访问集合
由于集合中的元素是无序的,所有不能像序列那样使用下标来进行访问,但可以使用迭代把集合中的数据一个个读取出来
set1 = {1,2,3,4,5,6,4,3,2,1,0}
for each in set1:
print(each,end=',')
# 0,1,2,3,4,5,6,
# 使用in 和not in print( 0 in set1) # True print('00' in set1) #False print('xx' not in set1) # True
4、不可变集合
frozenset() 定义一个不可变集合
set1 = frozenset({1,2,3,4,5})
set1.add(6)
# 报错 AttributeError: 'frozenset' object has no attribute 'add'
5、常用的方法
使用help(set) 查看帮助文档,使用dir(set)查看它有那些方法
for each in dir(set): print(each)
add
clear
copy
difference
difference_update
discard
intersection
intersection_update
isdisjoint
issubset
issuperset
pop
remove
symmetric_difference
symmetric_difference_update
union
update
#基本操作: t.add('x') # 添加一项 s.update([10 ,37 ,42]) # 在s中添加多项 t.remove('H') #使用remove( ) 可以删除一项: len(s) #set 的长度 x in s #测试 x 是否是 s 的成员 x not in s #测试 x 是否不是 s 的成员 s.issubset(t) s <= t #测试是否 s 中的每一个元素都在 t 中 s.issuperset(t) s >= t #测试是否 t 中的每一个元素都在 s 中 s.union(t) s | t #返回一个新的 set 包含 s 和 t 中的每一个元素 s.intersection(t) s & t #返回一个新的 set 包含 s 和 t 中的公共元素 s.difference(t) s - t #返回一个新的 set 包含 s 中有但是 t 中没有的元素 s.symmetric_difference(t) s ^ t #返回一个新的 set 包含 s 和 t 中不重复的元素 s.copy() #返回 set “s”的一个浅复制
6、练习
一.关系运算 有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合 pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'} linuxs={'wupeiqi','oldboy','gangdan'} 1. 求出即报名python又报名linux课程的学员名字集合 2. 求出所有报名的学生名字集合 3. 求出只报名python课程的学员名字 4. 求出没有同时这两门课程的学员名字集合
# 有如下两个集合,pythons是报名python课程的学员名字集合,linuxs是报名linux课程的学员名字集合 pythons={'alex','egon','yuanhao','wupeiqi','gangdan','biubiu'} linuxs={'wupeiqi','oldboy','gangdan'} # 求出即报名python又报名linux课程的学员名字集合 print(pythons & linuxs) # 求出所有报名的学生名字集合 print(pythons | linuxs) # 求出只报名python课程的学员名字 print(pythons - linuxs) # 求出没有同时这两门课程的学员名字集合 print(pythons ^ linuxs)
7、作业
[课后作业] 第027讲:集合:在我的世界里,你就是唯一 | 课后测试题
8、参考:
http://www.cnblogs.com/haiyan123/p/7218245.html
http://www.cnblogs.com/linhaifeng/articles/7133357.html#_label7
http://www.cnblogs.com/wupeiqi/articles/4911365.html

浙公网安备 33010602011771号