上QQ阅读APP看书,第一时间看更新
028 使用对称差集方法筛选工作表
此案例主要通过使用Python语言的集合的symmetric_difference()方法获取两个集合的对称差集,从而实现在两个工作表中筛选不同的行(或者说删除相同的行)。当运行此案例的Python代码(A361.py文件)之后,将根据“学员表.xlsx”文件的Java学员表和Android学员表筛选仅学一门课程的学员,即删除同时学习Java和Android的学员,Java学员表如图028-1所示,Android学员表如图028-2所示,筛选的仅学一门课程的学员表如图028-3所示。
图028-1
图028-2
图028-3
A361.py文件的Python代码如下:
import openpyxl myBook=openpyxl.load_workbook('学员表.xlsx',data_only=True) mySheet1=myBook['Android学员表'] mySheet2=myBook['Java学员表'] #将Android学员表复制成仅学一门课程的学员表(mySheet3) mySheet3=myBook.copy_worksheet(mySheet1) mySheet3.title='仅学一门课程的学员表' #删除仅学一门课程的学员表(mySheet3)的行(第1行除外) while mySheet3.max_row >1: mySheet3.delete_rows(2) #根据Android学员表(mySheet1)的行(第1行除外)创建集合(mySet1) mySet1=set(list(mySheet1.values)[1:]) #根据Java学员表(mySheet2)的行(第1行除外)创建集合(mySet2) mySet2=set(list(mySheet2.values)[1:]) #计算mySet1和mySet2两个集合的对称差集(mySet3),即获得两个工作表(集合)不同的行 mySet3=mySet1.symmetric_difference(mySet2) #循环集合(mySet3)的行(myRow)数据 for myRow in mySet3: #将行(myRow)数据添加到仅学一门课程的学员表(mySheet3)中 mySheet3.append(myRow) myBook.save('结果表-学员表.xlsx')
在上面这段代码中,mySet3=mySet1.symmetric_difference(mySet2)表示mySet1和mySet2两个集合的对称差集(mySet3)。集合A与集合B的对称差集定义为在集合A与集合B中所有不属于A∩B的元素(成员)的集合,请看下面这个简单的例子:
mySet1={1,2,3} mySet2={1,3,5} mySet3=mySet1.symmetric_difference(mySet2) print(mySet3)#输出:{2,5}
需要说明的是:mySet3=mySet1.symmetric_difference(mySet2)也可以写成mySet3=mySet1^mySet2。
此案例的源文件是MyCode\A361\A361.py。