五、用Python处理Excel数据 - 列表处理技术



1、列表基础

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2、列表切片

在这里插入图片描述
什么叫做切片,其实就是对列表数据的提取。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
注意,当第3个参数为负数的时候,它提取的方向就是从右侧开始往左来走,所以l[:5:-2]的范围是从a到f,步长是-2,所以是从右往左开始走,而f是结束位置不能算,所以打印是g。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3、列表的增加、删除、修改

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4、实例应用(汇总每个人的总成绩)

在这里插入图片描述

  • 要求:把每个人的所有科目成绩加起来得到每个人的总分,写入另外一个工作表里,结果如下图所示:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    又有新的问题了,拆出来之后每个元素又变成了一个列表,而且我只想提取列表里面的数字。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

5、列表操作符

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
要求:我指定岳成周这个人在我的每个日期里面他是否有值班,比如12月1日有5个人值班,他在不在里面,有的话在G列相应位置打勾,不存在的话打叉。
首先重要的是要读取每一行的数据:
在这里插入图片描述
在这里插入图片描述
我们发现跟上节课取某一列以列表的形式出现一样,这里我们取某一行它也是以列表的形式出现,但是我们发现每个列表的开头和结尾不是我们要的内容,那怎么取中间的数据呢?
在这里插入图片描述
在这里插入图片描述
ws.row_values(1)[1:-1],其中后面的-1的话列表中最后一个成员就要不成了,前面那个1的话那么0那个位置的就没有了,这样的话刚好是我们所想要的数据。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

6、列表推导式

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
如果列表里面只写for循环语句的话就会如上图所示报错。
在这里插入图片描述
在这里插入图片描述

列表推导式的转换

  • 把字符串型的数字转换成真正的整型数字。
    在这里插入图片描述
    在这里插入图片描述

列表嵌套推导式

在这里插入图片描述
在这里插入图片描述
l2里面的每个元素也是列表,我们把每个列表里面的元素再遍历一次,可以在for语句的后面再添加一个for语句用来遍历列表l,即先写最大的,再写小一点的,再写小一点的:
在这里插入图片描述
在这里插入图片描述
因为列表l2里面的每个列表有4个元素,又因为表达式是列表l,所以对列表l2中每个元素打印(遍历)了4次。
l是遍历l2,而x是遍历l,所以我们把前面的表达式l改成x来试试:
在这里插入图片描述
在这里插入图片描述

  • 我们把后面那个内嵌的for语句提到前面作为表达式试试:
    在这里插入图片描述
    在这里插入图片描述
    意思是它要先循环for x in l,但是最开始的时候它发现没有l这个列表,但是我们希望的是先执行后面的for循环,再将遍历出来的列表l付给前面的for循环中的变量l,但是它以为先循环前面的for,该怎么解决呢?
    在这里插入图片描述
    在这里插入图片描述
    这个时候你用中括号把前面的x for x in l加起来,这时候就会把它认成要处理这段,也就相当于前面这段不再是嵌套的推导式了,它会直接先运行后面的for循环,把l2里面的元素遍历出来,遍历出来后的处理方式就是前面那段,拿遍历出来的元素l再次做for循环遍历。
    在这里插入图片描述在这里插入图片描述

条件列表推导

  • 列表推导式的筛选功能就是可以通过if语句来实现,有条件的来控制。
    在这里插入图片描述
    在这里插入图片描述
    把if分支语句弄到列表推导式里面来,它要先判断下,再呈现出来,即x要大于等于90,那么它才能够显示出来,否则不行,筛选出来的只有上图这3个数字,如果你还有更多条件的话继续写在后面就可以了。

在这里插入图片描述
在这里插入图片描述
这两个for循环推导的都是同一个列表,x是第一个for循环的,y是第二个for循环的,这个就相当于做了一次笛卡尔积的运算,每个数字之间做了两个数的组合,看一共有多少个组合,可以组合多少次,如果相同数字不能组合到一起的话,你同样可以给它判断下,通过if语句筛选。
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

7、实例应用(筛选各工作表中符合条件的值)

在这里插入图片描述
在这里插入图片描述
对每个工作表的金额这一列进行遍历,看下哪些是大于等于2万的,如果大于等于2万就把这个数值保存到另一个新的工作簿中对应月份的行内第2列里面,比方说把1月所有大于等于2万的金额放在一个单元格里面,每个月都这样做。

  • 我们要做的第一件事情就是,我怎样才能够把每个工作表都可以判断到,核心的技术点就是我怎样实现对一列的数据进行筛选式的判断。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    这个证明遍历出来的就是指定工作簿下面每个工作表,赋给变量ws。
  • 如果我想读取工作簿下面每个工作表B列的数据该如何完成呢?
    在这里插入图片描述
    在这里插入图片描述
    我们看到每一个工作表中列里面的数据都是列表,行方向的话如果选择某一行也都是列表,但是我们金额是不需要的,所以
    在这里插入图片描述
    在这里插入图片描述
  • 我们开始对每个列表筛选:
    在这里插入图片描述
    在这里插入图片描述
  • 这个推导式打印出来的结果和前面的print(ws.col_values(1)[1:]打印出来的没有任何的变化,因为我还没有进行筛选,现在就来在推导式中写条件判断。
    在这里插入图片描述
    在这里插入图片描述
    但是此时我们发现打印出来的都是浮点类型,因为工作表中的数据都是浮点型,如果要把每个月份的数据都合起来成为一串的话,就需要把它们转换成字符串类型的才可以,如果你直接把这些浮点类型转换成字符串类型的话,每个数后面都像上图那样带有没有用处的小数,所以我们先把浮点型数字转换成整数,然后再转换成字符串类型就可以了。
    在这里插入图片描述
    - 因为l是一个列表,通过join方法将该列表中每个元素以指定的字符连接生成一个新的字符串。
    在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

8、列表转换

在这里插入图片描述

list 方法

在这里插入图片描述

reverse 方法

在这里插入图片描述
在这里插入图片描述

copy 方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
你会发现前面两个的内存地址是一样的,而后面这个l5的内存地址是不一样的,说明通过copy方法开辟了一个新的对象(或者说内存空间),而前面这两个相当于两个标签指向了同一个对象而已,所以赋值和copy方法是有区别的。
在这里插入图片描述
在这里插入图片描述

  • l3和l5只是不同的标签指向了同一个对象,而l3.copy()这个方法调用,是将l3这个对象复制了一份,形成了一个新的对象l5,所以我们看到l5的内存地址是不一样的。

在这里插入图片描述

zip 方法

在这里插入图片描述
在这里插入图片描述

  • 因为zip产生的是个迭代器,后面我们会讲,现在你就把它认成跟前面讲的range那个函数一样,指定数字范围一样。
    在这里插入图片描述
    在这里插入图片描述

  • 我们有一种叫做反解压,在l6的前面加上一个*星号。
    在这里插入图片描述
    在这里插入图片描述
    就会把1和4连起来,2和5组合成一组,然后3和6组合成一组;里面的小括号括起来指的就是一个元组,我们后面会讲。

  • 如果你要进行压缩结合的列表不在同一个列表里面,是分开的两个单独的列表,该如何完成呢?
    在这里插入图片描述
    现在大家不理解迭代器不用管它,反正就记住zip([L7, L8])这个里面其实它可以生成一个列表,但是现在由于它是迭代器所以完不成,所以需要通过list进行转换,因为转换成list后你才能看到。
    在这里插入图片描述
    这样子有的叫做反解压,如果你不这样表达,其实你可以如下面所示直接写也可以:
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述
- 如果你把l7和l8都放在一个列表框里了,你就得加*星号。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
- 如果你把l7和l8放在zip方法的每个参数位置上也可以。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • zip会把这3个列表打包成一个个元素为元组的列表,这个元组也是可以修改的。
    在这里插入图片描述
    在这里插入图片描述
  • zip也可以进行推导式,比如说上图里面每个元素都是元组,我现在还没有学过元组,打印出来的这个外层是一个列表,能不能把这个列表里面的每个元素也变成一个列表呢?也可以,你可以用推导的方式完成:
    在这里插入图片描述
    在这里插入图片描述
    zip(l7, l8)其实就是一个迭代器,而上图第一个print语句,通过list转换就相当于是一个循环,把这个迭代器里面的元素一个个取出来,但是我现在不想用它默认的这种元组的方式,而是真正弄了一个for循环把这个迭代器中的元素取出来,我们这里想分别取两个值放到x和y两个变量里面,x就代表取l7里面的,y就代表取l8的,然后我在前面把我所推导出来的x和y都放到列表里面。
    在这里插入图片描述
    但是打印出来的是个对象,打印不出这个取出来的内容,怎么办呢?把这个对象转换成列表即可:
    在这里插入图片描述
    就相当于我们不用它默认的list(zip(l7, l8))这种小括号元组的方式,而是像上图那样通过列表推导式用方括号这种列表的方式来表示。

在这里插入图片描述

  • 这就是zip方法的作用,可以将不同的列表、多个列表进行这种组合。

9、实例应用(统计出大于等于2万的记录到新表)

在这里插入图片描述
在这里插入图片描述
要求:大于等于2万的金额,以及对应的日期和月份,这三个要素要写到新的工作簿里面,把1到12月份的符合的数据全部列到新工作簿中的一张表里面:
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
第0列是日期,第1列是金额,我们想把它们合到一起的话用什么方法呢?

  • 我们用之前讲过的推导式,并利用上节课讲过的zip方法来完成:
    在这里插入图片描述
    在这里插入图片描述
    由于我们不需要日期和金额这两个表头,所以要把它们去掉:
    在这里插入图片描述
    在这里插入图片描述
    当然,如果你一行一行的取值的话,也能形成列表,方法有多种,看哪种更方便就使用哪种。

列表推导式中的y就代表金额这一列,所以我们可以通过y来筛选出金额大于等于2万的数据:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样的话,这个新生成的明细就非常好了,这个大于等于2万的金额,是哪个月份的,具体到这个月份的哪一天,都有了。

import xlrd, xlwt
wb = xlrd.open_workbook("2018年业绩表.xls")
nwb = xlwt.Workbook(encoding="utf-8")
nws = nwb.add_sheet("筛选结果")
r = 0
for ws in wb.sheets():
    col_date = ws.col_values(0)[1:]
    col_amount = ws.col_values(1)[1:]
    # print(col_date, col_amount)
    # print([[x, y] for x, y in zip(col_date, col_amount) if y > 20000])
    list_data = [[x, y] for x, y in zip(col_date, col_amount) if y > 20000]
    # print(list_data)
    # print(list_data[0], list_data[1])
    # print(type(list_data))
    for data in list_data:
        # print(data[0], data[1])
        r += 1
        nws.write(r, 0, ws.name)
        nws.write(r, 1, data[0])
        nws.write(r, 2, data[1])
nws.write(0, 0, "月份");nws.write(0, 1, "日期");nws.write(0, 2, "金额")
nwb.save("筛选结果.xls")

在这里插入图片描述

10、列表常见统计方式1

在这里插入图片描述
在这里插入图片描述

实例应用:如下表所示,我们统计一下每个人工资的各项数据

  • 要求:每个人的工资发的月份数不一样,每个人各个月的工资金额以顿号分隔,我们统计下每个人一共发了多少次工资(月份数)、最高工资、最低工资、总工资是多少、平均工资是多少等数据,最后全部放在汇总结果这一列里面。
    在这里插入图片描述
    工资这一列的数据虽然是文本,但是该列的每行数据cell是以顿号来分隔的,所以可以对该数据cell以顿号进行拆分,将拆分之后得到的文本数字转换为真正的数字,通过列表推导式转化之后就成为了一个列表,我们可以利用这些列表来完成所要求的统计。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    每个单元格里的值取出来之后,接下来我们要做的事情就是拆分,我们是以顿号来进行拆分,拆分出来之后每个又形成一个列表:
    在这里插入图片描述
    在这里插入图片描述
    我们通过列表推导式,将拆分出来的列表当中的每个元素赋给变量n:
    在这里插入图片描述
    这样的列表推导式跟上面的相比是没变化的,因为列表推导式最前面的表达式n没有做任何的处理,但是我们想把字符串类型的n转换成整数类型:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

11、列表常见统计方式2

在这里插入图片描述

案例:

我们有个获奖名单.xls,要求统计每个人获奖多少次,不管他是多少名,只要他获奖了就可以。
Sheet1是个二维的表,我们怎样把它弄成一维的表里面去呢,也就是弄到一个列表里面,然后我通过统计表里面的姓名,统计下我这个姓名在这个列表里出现的次数就可以了,出现的次数就表示获奖的次数。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
接下来要把上图中这些一行一行的列表,一个接一个的连起来,连接成一个列表。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

import xlrd
from xlutils.copy import copy
wb = xlrd.open_workbook("获奖名单.xls")
ws1 = wb.sheet_by_name("Sheet1")
ws2 = wb.sheet_by_name("统计表")
nwb = copy(wb)
nws = nwb.get_sheet("统计表")
n, r = 0, 0
lstr = []
while n < ws1.nrows - 1:
    n += 1
    lstr += ws1.row_values(n)[1:]
lname = ws2.col_values(0)[1:]
# print([x + ":" + str(lstr.count(x)) + "次" for x in lname])
lresult = [lstr.count(x) for x in lname]
for y in lresult:
    r += 1
    nws.write(r, 1, y)
nwb.save("获奖名单.xls")
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值