Python入门:对Excel数据处理的学习笔记【第五章】列表类型处理技术

注:该学习笔记是根据曾志贤老师编写的《从Excel到Python,用Python轻松处理Excel数据》所学习整理的笔记。

第五章 列表类型处理技术

列表是Python中最基础的数据结构。列表类似于数组,是数据的集合,集合内可以放任何数据类型的数据。
列表用中括号([])表示,列表里的元素用逗号分隔。

一、列表的创建与删除

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使用加运算符的累积功能
appendappend(object)在列表末端添加一个元素
extendextend(iterable)在列表末端添加多个元素
insertinsert(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、列表元素的删除

名称语法结构注释
removeremove(object)从列表中删除指定的元素,不是指定元素的位置
poppop()默认删除列表中的最后一个元素
poppop(index)删除列表中指定位置的元素
deldel删除指定列表范围的元素
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')

在这里插入图片描述

五、列表推导式

列表推导式在逻辑上相当于一个for循环语句,只是形式上更加简洁。列表推导式执行完成后会创建新的列表。无论列表推导式的写法如何变化,最后都会返回列表对象。如果循环的目的是将数据写入指定单元格,那么最好用标砖的循环语句,而不要用列表推导式。

1、标准列表推导式

列表推导式语法结构:
[表达式 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')

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MeJonKing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值