注:该学习笔记是根据曾志贤老师编写的《从Excel到Python,用Python轻松处理Excel数据》所学习整理的笔记。
目录列表是Python中最基础的数据结构。列表类似于数组,是数据的集合,集合内可以放任何数据类型的数据。
列表用中括号([])表示,列表里的元素用逗号分隔。
- 第五章 列表处理技术
- 一、列表的创建与删除
- 二、列表的单、多元素切片
- 案例一、列表切片按行对数据求平均值
- 三、列表元素的增加、删除、和修改
- 1、列表元素的修改
- 2、列表元素的添加
- 3、列表元素的删除
- 案例一、列表综合运用按行对分数求和
- 四、列表 *** 作符
- 1、列表 *** 作符基础
- 案例一、列表 *** 作符按条件统计多工作表数据
- 五、列表推导式
- 1、标准列表推导式
- 2、列表推导式变异
- 3、嵌套列表推导式
- 4、条件列表推导式
- 六、列表的转换
- 1、类对象的转换
- 2、反转列表
- 3、列表的浅、深复制
- 4、列表组合
- 案例一、给名单中的姓名添加序号
- 七、列表常用统计方式
- 1、列表常用统计函数1
- 案例一、统计信息
- 2、常用统计函数2
- 案例一、按指定条件统计
lst1=[];print(lst1) #用中括号[]来创建列表
lst2=list();print(type(lst2)) #使用list函数来创建列表
lst3=[1,2,3];print(lst3) #给列表写入元素
lst4=[4,5,6];print(lst4)
lst3.clear();print(lst3) #使用clear函数删除lst3列表的元素
del lst4;print(lst4) #使用 del 删除lst4列表
二、列表的单、多元素切片
案例一、列表切片按行对数据求平均值由于切片内容有上一章节字符串的切片相同,该章节不在复述。
将“分数表”工作簿中的,“分数表”工作表按照每个人1~12月的分数,计算平均值,写入N列。
import xlrd
from xlutils.copy import copy
wb=xlrd.open_workbook('分数表.xls')
ws=wb.sheet_by_name('分数表')
nwb=copy(wb)
nws=nwb.get_sheet('分数表')
for row_num in range(1,ws.nrows):
row_val=ws.row_values(row_num) #获取整行的字符串
i=sum(row_val[1:-1])/(ws.ncols-2) #将整行的字符串转换为数值,并使用SUM求和,然后除以个数得到平均值。
j=round(i,2) #四舍五入后,保留小数点后两位。
nws.write(row_num,13,j)
nwb.save('分数表-1.xls')
三、列表元素的增加、删除、和修改
1、列表元素的修改
对列表中的元素进行修改,语法结构为:列表[索引位置]=修改的值。
lst=['张三',18,[100,90]]
lst[0]='小明'
lst[1]='18岁'
lst[2]='语文100;数学90'
print(lst) #返回 ['小明', '18岁', '语文100;数学90']
lst1=['张三',18,[100,90]]
lst1[0:2]=[9,27]
print(lst1) #返回 [9, 27, [100, 90]]
2、列表元素的添加
名称 | 语法结构 | 注释 |
---|---|---|
+ | list +=list | 使用加运算符的累积功能 |
append | append(object) | 在列表末端添加一个元素 |
extend | extend(iterable) | 在列表末端添加多个元素 |
insert | insert(index,object) | 在列表指定位置添加一个元素 |
lst=['张三']
print(lst)
lst +=['6年级']
print(lst)
lst.append('9班')
print(lst)
lst.extend(['第一组','第二排'])
print(lst)
lst.insert(1,'12岁') #改变顺序,增加计算量。慎用
print(lst)
3、列表元素的删除
名称 | 语法结构 | 注释 |
---|---|---|
remove | remove(object) | 从列表中删除指定的元素,不是指定元素的位置 |
pop | pop() | 默认删除列表中的最后一个元素 |
pop | pop(index) | 删除列表中指定位置的元素 |
del | del | 删除指定列表范围的元素 |
lst=['张三', '12岁', '6年级', '9班', '第一组', '第二排']
print(lst)
lst.remove('12岁') #如果有相同的元素,只删除第一次出现的元素。
print(lst)
lst.pop()
print(lst)
lst.pop(2)
print(lst)
del lst[1:]
print(lst)
案例一、列表综合运用按行对分数求和
在“成绩汇总”工作簿中的“分数表”工作表的每个人1~12月的分数进行判断,对大于或等于80分的分数进行求和,并写在N列。
import xlrd
from xlutils.copy import copy
wb=xlrd.open_workbook('成绩汇总.xls')
ws=wb.sheet_by_name('分数表')
nwb=copy(wb)
nws=nwb.get_sheet('分数表')
for row_num in range(1,ws.nrows):
row_vals=ws.row_values(row_num)[1:-1]
num=[]
for lst_num in row_vals:
if lst_num>=80:
num.append(lst_num)
nws.write(row_num,ws.ncols-1,sum(num))
nwb.save('成绩汇总-1.xls')
四、列表 *** 作符
1、列表 *** 作符基础
列表 *** 作符有:
- 列表的连接:+
- 列表的重复:*
- 列表的判断:in
- 比较运算符
print([1,2,3]+[4,5,6]) #返回 [1, 2, 3, 4, 5, 6]
print([1,2,3]*2) #返回 [1, 2, 3, 1, 2, 3]
print(2 in [1,2,3]) #返回 True
print(4 in [1,2,3]) #返回 False
print([1,2,3]<[1,3,2]) #按照顺序逐个对比,当出现false或者true时,返回。
案例一、列表 *** 作符按条件统计多工作表数据
在“优秀员工”工作簿中,把三张工作表中“问问梅”出现的次数分别在新工作表中统计出来。
import xlrd
from xlutils.copy import copy
wb=xlrd.open_workbook('优秀员工.xls')
nwb=copy(wb)
nws=nwb.add_sheet('统计')
nws.write(0,0,'时间')
nws.write(0,1,'次数')
nws_row_num=0
for ws_num in wb.sheets():
num=0
nws_row_num +=1
for row_num in range(1,ws_num.nrows):
lst_num=ws_num.row_values(row_num)[1:]
if '问问梅' in lst_num:
num +=1
nws.write(nws_row_num,0,ws_num.name)
nws.write(nws_row_num,1,num)
nwb.save('优秀员工-1.xls')
五、列表推导式
1、标准列表推导式列表推导式在逻辑上相当于一个for循环语句,只是形式上更加简洁。列表推导式执行完成后会创建新的列表。无论列表推导式的写法如何变化,最后都会返回列表对象。如果循环的目的是将数据写入指定单元格,那么最好用标砖的循环语句,而不要用列表推导式。
列表推导式语法结构:
[表达式 for 变量 in 列表]
lst=['89','96','100','72']
#使用列表推导式的方式
lst1=[int(i) for i in lst]
print(lst1)
#使用循环的方式
lst2=[]
for i in lst:
lst2.append(int(i))
print(lst2)
2、列表推导式变异
如果列表中的元素不是单值,而是其他列表或可循环序列时,则在使用列表推导式前将其元素进行拆分。
lst=[[1,2,5],[10,5,6],[8,5,3]]
#列表推导式方式1
print([i[0]*i[1]*i[2] for i in lst])
#列表推导式方式2
print([i*j*k for i,j,k in lst])
#循环方式1
lst3=[]
for i in lst:
lst3 +=[i[0]*i[1]*i[2]]
print(lst3)
#循环方式2
lst4=[]
for i,j,k in lst:
lst4 +=[i*j*k]
print(lst4)
3、嵌套列表推导式
嵌套列表推导式的语法结构:
[表达式 for 变量1 in 列表1 for 变量2 in 变量1 for 变量3 in 变量2…]可多层嵌套,注意放在in后面的对象必须是可迭代对象。
lst=[[1,2],[3,4,5],[6,7]]
#使用嵌套列表的方式
print([j for i in lst for j in i])
#使用嵌套循环的方式
lst2=[]
for i in lst:
for j in i:
lst2 += [j]
#或写成 lst2.append(j)
print(lst2)
4、条件列表推导式
条件列表推导式语法结构:[表达式 for 变量 in 列表 if 条件判断]
lst=[85,68,98,74,95,82,93,88,74]
#使用条件列表推导式方式
print([i for i in lst if i>=90])
#多条件列表推导方式
lst1=[[25],[68,43],[120],[14,25],[63,24],[45,12,46]]
print([k for k in lst1 if sum(k)>=100 and len(k)>=2])
#嵌套条件列表推导方式
print([m for l in lst1 for m in l if m>=50])
#使用条件循环方式
j=[]
for i in lst:
if i>=90:
j +=[i]
print(j)
六、列表的转换
1、类对象的转换将其他对象转换为列表,或将列表的位置、顺序等进行调整。
任何可迭代对象均可直接或间接转换为列表,要完成这些转换可以使用list类,对类进行实例化可以创建对象,因此可以通过list类来创建列表对象。
语法结构:
list([iterable])
参数说明:
- iterable:可选参数,可迭代对象。
print(list('123'),[int(i) for i in '123']) #将字符串转换为列表
print(list((1,2,3))) #将元组转换为列表
print(list({1,2,3})) #将集合转换为列表
print(list({'a':1,'b':2,'c':3})) #将字典转换为列表
print(list(range(1,5))) #转换可迭代的对象
2、反转列表
要将列表中的元素反转,可以使用reverse函数。
语法结构:
reverse()
参数说明:
- 该函数没有参数,可以对列表中的元素进行反向排序。
lst=[1,2,3,4]
lst.reverse()
print(lst)
print(lst[::-1])
lst1=['a','b','c','d']
print([lst1[i] for i in range(len(lst1)-1,-1,-1)])
3、列表的浅、深复制
列表复制分为:浅复制和深复制。
浅复制:只引用对象的内存地址,使用copy函数。
语法结构:
copy()
参数说明:
- 该函数没有参数。
深复制:重新开辟一个新的内存空间,得到完全独立的新对象。深复制要先导入copy标准模块,然后使用中copy模块中的deepcopy函数。
语法结构:
deepcopy(x)
参数说明:
- x:必选参数,被深复制的对象。
lst=[1,2,3,4]
lst2=lst.copy() #浅复制到lst2
print(lst2)
import copy #深复制需要导入copy模块
lst3=[1,[2,3],4]
lst4=copy.deepcopy(lst3) #深复制
lst3[1]=[22,33]
print(lst3)
print(lst4)
4、列表组合
zip函数是Python中的一个内建函数,它接收一系列可迭代的对象作为参数,将对象中对应的元素打包成一个个tuple(元组),然后返回由这些元组组成的一个可迭代对象。
语法结构:
zip(*iterables)
参数说明:
iterables:会少1个可迭代对象。
lst=[['a','b','c','d'],[1,2,3,4]]
#列表组合方式1
lst1=list(zip(lst[0],lst[1]))
print(lst1) #返回 [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
lst2=list(zip(lst[0],lst[1],range(50,100)))
print(lst2) #返回 [('a', 1, 50), ('b', 2, 51), ('c', 3, 52), ('d', 4, 53)]
#列表组合方式2
lst3=list(zip(*lst)) # *的意思为拆散列表
print(lst3) #返回 [('a', 1), ('b', 2), ('c', 3), ('d', 4)]
#列表组合方式3
lst4=[('a', 1), ('b', 2), ('c', 3), ('d', 4)]
lst5=list(zip(*lst4))
print(lst5) #返回 [('a', 'b', 'c', 'd'), (1, 2, 3, 4)]
#循环的方式
lst10=[]
for i in range(0,len(lst[1])):
lst10.append([lst[0][i],lst[1][i]])
print(lst10) #返回 [['a', 1], ['b', 2], ['c', 3], ['d', 4]]
案例一、给名单中的姓名添加序号
在“员工表”工作簿中的“员工表”工作表B列的每个姓名前添加序号。
import xlrd
from xlutils.copy import copy
wb=xlrd.open_workbook('员工表.xls')
ws=wb.sheet_by_name('员工表')
nwb=copy(wb)
nws=nwb.add_sheet('整理结果')
nws.write(0,0,'公司名')
nws.write(0,1,'名单')
for num in range(1,ws.nrows):
row_val=ws.row_values(num)[1].split('、') #取列表的第2元素,按照“、”拆分成新的列表
i=0
lst=[]
for val in row_val: #将拆分成的新列表放入循环
i +=1 #计数作为序号用
lst.append(str(i)+str(val)) #将序号和循环出来的元素转换为str并组合在一起变成的列表
row_vals='、'.join(lst) #将这一行的所有列表按照“、”进行组合
nws.write(num,0,ws.cell_value(num,0))
nws.write(num,1,row_vals)
nwb.save('员工表-1.xls')
七、列表常用统计方式
1、列表常用统计函数1
常用统计函数:
- len:计数
- sum:求和
- max:最大值
- min:最小值
lst=[100,99,81,86]
print(len(lst)) #返回 4
print(sum(lst)) #返回 366
print(max(lst)) #返回 100
print(min(lst)) #返回 81
print(sum(lst)/len(lst)) #返回 91.5 平均值
案例一、统计信息
对“工资”工作簿中的“工资表”工作表中每个人1~12月的工资进行统计,分别统计每个人的工资总计、月份总数、平均工资、最高工资、最低工资。
import xlrd
from xlutils.copy import copy
wb=xlrd.open_workbook('工资.xls')
ws=wb.sheet_by_name('工资表')
nwb=copy(wb)
nws=nwb.get_sheet('工资表')
name=['工资合计:','月份总数:','平均工资:','最高工资:','最低工资:']
dw=['元','个','元','元','元']
for num in range(1,ws.nrows):
row_vals=ws.row_values(num)[1:-1]
lst=[]
for num1 in row_vals: #将列表的元素进行循环
if num1!='': #循环判断是否不为空
lst.append(num1) #将不为空的元素添加到新的列表
lst1=[sum(lst),len(lst),sum(lst)/len(lst),max(lst),min(lst)] #计算
lst2=[name,lst1,dw] #组合
lst3=[]
for i,j,k in list(zip(*lst2)): #使用zip将组合的列表按照顺序重新组合,同时三个变量进入循环
lst3.append('{}{}{}'.format(i,int(j),k)) #格式化后添加到新的列表
txt='\n'.join(lst3) #使用换行符联结新列表的元素
nws.write(num,ws.ncols-1,txt)
nwb.save('工资-1.xls')
2、常用统计函数2
在列表中,要统计指定元素在列表出现的次数,可以使用count函数,要统计指定元素在列表中出现的位置,可以使用index函数。
lst=['a','b','c','b','b']
print(lst.count('b')) #返回 3
print(lst.index('c')) #返回 2
案例一、按指定条件统计
在“成绩”工作簿中的“成绩”工作表中按照每个人获得优、良、中、差四个等级的次数进行统计。
import xlrd
from xlutils.copy import copy
wb=xlrd.open_workbook('成绩.xls')
ws=wb.sheet_by_name('成绩表')
nwb=copy(wb)
nws=nwb.get_sheet('成绩表')
lst=['优','良','中','差']
for num in range(1,ws.nrows):
row_vals=ws.row_values(num)[1:-1]
lst1=[]
for val in lst:
num1=row_vals.count(val) #使用count统计各等级出现的次数
lst1.append(num1)
lst2=[lst,lst1]
lst3=[]
for i,j in list(zip(*lst2)):
lst3.append('{}:{}'.format(i,j))
txt='\n'.join(lst3)
nws.write(num,ws.ncols-1,txt)
nwb.save('成绩-1.xls')
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)