七、用Python处理Excel数据 - 字典处理技术

字典处理技术



1、字典的基础

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

键必须具有唯一性:

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

键必须不可变:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上图实例的要求是要把列表l变成字典,并获取列表l里面内容的唯一值,即去重。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 又一个张三,此时就是要对张三这个键值对进行修改。
  • 如果你要操作的键的这个键名称是存在的,那么就是修改;如果你要操作的键的名称是不存在的,那么就添加。
    在这里插入图片描述
    如果我只想要字典d中键的名称呢?
    可以通过list来取得字典d里面所有的键名称,它默认可以取到字典里面的键。
    在这里插入图片描述
    在这里插入图片描述

2、实例应用(提取产品最后的记录)

在这里插入图片描述
要求:上图表内数据都已排序(销量从小到大),要求将每天最后一个销量(值最大)提取出来,即提取相同日期里面最后一个数据。
把我们日期这一列的数据当作键,把销量这一列的数据当作值,写入字典当中。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 接下来我们要做一件什么事情呢,将日期作为键,将销量作为值,写入到字典。
    在这里插入图片描述
  • 单步调试如下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 因为第一次循环之后,字典d中没有’2018/12/1’这个键和45.0这个值,所以第二次循环我们就是往里面添加这个键值对。
    在这里插入图片描述
    在这里插入图片描述
  • 当进行到如上图所示的第三次循环的时候,现在其实就是说,我要将字典当中键名为’2018/12/1’的键名,它对应的值45.0修改成我提供的61.0,剩下的循环以此类推。
    在这里插入图片描述
    在这里插入图片描述
  • 当循环修改了’2018/12/1’最后一个值50之后,当循环进行到如上图所示,就是该往字典里添加新的日期’2018/12/10’和值50了,同理,后面的是继续修改’2018/12/10’对应的值,当改到第19行’2018/12/10’的最后一个值196的时候修改结束,再继续添加新的日期’2018/12/11’和值46了。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 如上图所示,这就是每个日期里面的最后一条记录。

在这里插入图片描述

3、字典的转换

dict 转换法

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

  • 下图这四种写法其实都是一样的
    在这里插入图片描述
转换方法2到5

首先它里面是个元组:
在这里插入图片描述
这个元组里面再给两个元组:
在这里插入图片描述
在这里插入图片描述

  • 也就是说,整体外侧是一个元组,元组里面是两个元素,这两个元素也都是元组,第一个元素元组相当于是第一个键值对,第二个元素是字典里面的第二个键值对,它们之间也是以元组的形式展示的。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
  • 如下图所示选中的部分就是列表和元组之间随便你怎么组合都可以:
    在这里插入图片描述
  • 外面可以是括号(元组),元组里面每个元素之间可以是列表,也可以是元组(即元组里面可以是元组);
  • 也可以外侧是中括号(列表),里面每个元素之间可以是列表,也可以外侧是列表,里面是元组。
    在这里插入图片描述
  • 每一个元素里面有两项,前面是键名称,后面是值,元组和列表你随便怎么组合都可以,就是这4种组合,都可以创建出字典。
    在这里插入图片描述
转换方法6(通过批量数据一次性转换成一个字典,而不用一个一个的添加)

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

  • 如果是这种两个列表的形式,我希望’a’对1,'b’对2,'c’对3,它不像前面那种都是已经对应好的了,该怎么办呢?
    在这里插入图片描述
    在这里插入图片描述
  • 还有这种形式,外侧是列表,里面有两个元素,这两个元素都是列表,第一个元素里面的3个对应的是键名,第二个元素里面的对应的是值,我能不能使用zip来转换呢:
    在这里插入图片描述
    结果报错:
    在这里插入图片描述
    该怎么解决呢?
    在这里插入图片描述
    在这里插入图片描述
    即,如果是前面那种k和v分开的结构,那你直接在函数zip的第1和第2参数写上就行了;
    在这里插入图片描述
    如果你发现它是合在一起的,像上图所选中的那种,它们两个元素已经被放在一个容器里面,那么你就直接用*星号来反解压就可以,也叫做展开,将l这一个容器展开为两个元素,然后通过zip它们就能一组一组对应的结合起来了,就没有问题了。
    这就是关于我们怎样来批量获取字典的一种方法,比如工作表里某一列数据我要把它当作键的名称,另一列的数据我要把它当作值,那你能不能批量的把它们添加到字典里面来呢,用上面的方法就可以。

dict.fromkeys转换法(批量的转换成字典)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
即,它们的键名称不同,但是它们的值都是相同的,那你就可以这样写。
如果第2个参数你不写的话,那么字典中键名称对应的值就会是None:
在这里插入图片描述
在这里插入图片描述
这种方式的作用还是挺强大的,比方说我在给它加个键名称’c’行不行呢:
在这里插入图片描述
在这里插入图片描述

  • 它可以起到去重的功能,即去掉重复值,保留唯一值的功能。

4、实例应用(多列求唯一值)

在这里插入图片描述
在这里插入图片描述
利用字典的去重功能来求出上图表格中数据的唯一值。

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

现在我们要用zip把上面这三列重复的数据给交错连接一下:

在这里插入图片描述
在这里插入图片描述
这是一个对象,是一个可迭代对象,如果你想看它里面的内容的话,可以使用list转换一下:
在这里插入图片描述
在这里插入图片描述
从上图输出结果可以看出,每一个是以元组的形式显示的,所以我们就可以把这个元组作为字典的键的名称。
在这里插入图片描述
先看下记录有多少条:在这里插入图片描述

我们怎样把它l做成字典的键的名称呢?怎样批量的来完成呢?

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

在这里插入图片描述

  • 我们再来统计下此时这种形式的字典有多少条记录:
    在这里插入图片描述
    由刚才的2000多变成了306了,此时就去重了。
    但是去重之后,我现在只想要键的部分,这个时候我们可以用循环的方式把它拿出来:
    在这里插入图片描述
    在这里插入图片描述
    我们说字典里面有两部分,我们没有指定要取字典d中的哪部分,我这里直接写d,d后面我没有说要循环什么, for循环这里默认循环出来的取的是字典里面的键名称,因为我们字典里面键名称是元组,字典里面的值是None对我们也没什么用,即这个for循环是要告诉大家的意思是,你如果要循环字典的话,默认循环的是它的键名称,当然你其实也可以同时取它的值的。

我们就可以把去重之后的结果写入到新的表里面了。
在这里插入图片描述
由于它每次循环出来的键名称里面有3个部分,即每取出一个k这个变量,它是一个元组,这个元组里面分3部分,我们可以这样来写:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 以上内容就是如何用字典来进行多列的去重,这里面的关键点就是,多列的话可以把这个多列做成一个元组,元组这种结构可以放到字典里面做成它的键名,这就是元组的作用,你用列表的话不行,用字符串的话也可以,但是比较麻烦,因为你要把它合并起来等等。
    在这里插入图片描述

5、字典的删除

clear方法清空字典

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

pop方法删除字典

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

  • popitem虽然说得是随机,但是一般来说是删除的字典当中的最后一条。

del语句删除字典

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

  • 这里为什么会出错呢?因为del不是把内容给清空,而是把整个字典都删除了,这个对象消失了,而像我们前面讲的clear方法是把字典当中的内容给清空,还留有一个空壳,这个字典对象还是存在的。

6、实例应用(查询未发货订单)

实例要求

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

思路:将已发货的订单,从全部订单里删除,剩下的就是未发货的。

利用我们讲的字典技术,把’全部订单’表里面的内容做成一个字典a,把’已发货’表里面的内容也做成一个字典b,然后根据字典b的内容从字典a里面删除就可以了。
在这里插入图片描述

  • 接下来将“全部订单”表里面的第1列、第2列和第3列合到一起,并且将“已发货”表里面的第1列、第2列和第3列合到一起,这样看的话更方便:
    在这里插入图片描述
    在这里插入图片描述

接着将列表通过zip批量的转换成字典:

在这里插入图片描述
在这里插入图片描述
看到了没,这就把它们做成键名称了,当然我们不想把(‘省份’, ‘客户名称’, ‘订单编号’)这个表头删除,怎么办呢,那就在’已发货’这个字典里把这个表头跳过就可以了:
在这里插入图片描述
在这里插入图片描述

但是报错了,字典不能“切片",那该怎么办呢?

  • 那就把这第2个’已发货’字典给转换成列表,再’切片’就可以了:
    在这里插入图片描述
    在这里插入图片描述
    我不把第2个’已发货’表弄成字典了,我把它弄成列表,然后就可以跳过表头了:
    在这里插入图片描述
    在这里插入图片描述
    这样我就通过循环一个一个的从d2里面取每一条记录,例如把d2里面的第一条作为键名,到d1这个字典里面去找,找到之后删除。
    在这里插入图片描述
    我们要删除的那些订单其实就已经在这个x里面了:
    在这里插入图片描述
  • 用d2里面的键名到d1里面去循环删除,删除之后,d1里面就只剩下未发货的,我们来对比看下d1删除前和删除后的记录数量:
    在这里插入图片描述
    在这里插入图片描述
    字典里面如果后面没有指定你要去循环它的键名称还是对应的值,那它默认就是键的名称,因为对应的值是None,所以我们就用键名称:
    在这里插入图片描述
    在这里插入图片描述
    接着就是将这些未发货的数据写到’未发货’表里面去就可以了。
    在这里插入图片描述
    获取到’未发货’这个表后,接着我们就要通过循环一行一行的写入,所以就需要一个行号,并且由于d1循环出来的每一条键名都是元组,我要一一对应写到’未发货’这个表里的第1列、第2列和第3列:
    在这里插入图片描述

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

7、字典的修改

字典的值修改

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

  • 将字典中键名为’lili’的值修改为100:
    在这里插入图片描述
    在这里插入图片描述
  • 假如你要修改的键名不存在的话,它就变成了添加:
    在这里插入图片描述
    在这里插入图片描述
    即,假如要修改的键名不存在它就是添加,存在的话它就是修改。
    在这里插入图片描述

字典的键名修改

在这里插入图片描述
要注意,上图这种不叫修改,这叫添加,因为根本不存在’lili’这个键,它只是把’lily’这个键的值赋给’lili’这个键,起到了添加’lili’这个键和对应的值而已:
在这里插入图片描述
当然,你也可以在添加了’lili’这个键后,紧接着把’lily’这个键和对应的值删除:
在这里插入图片描述
在这里插入图片描述
其实,把上面的这两句改成一句就可以搞定:
在这里插入图片描述

  • 这样就相当于是字典的键名的修改。
    在这里插入图片描述
    你可以发现,修改的键名都跑到字典最后面去了,说明就是这个原理:相当于先增加一个,再删除一个。
    在这里插入图片描述

字典的连接

比如说有两个字典,我们把它们连起来、合并到一起,成为一个字典。
在这里插入图片描述
在这里插入图片描述

我可以通过字典的update方法,把字典d2更新到字典d1里面去:

也就相当于是把d2里面的内容添加到d1里面。
在这里插入图片描述
在这里插入图片描述

  • 当然,也可以反过来,在d2里面添加d1也行:
    在这里插入图片描述
    在这里插入图片描述
    也就是先有d2里面的内容,再把d1的内容添加进来。
    这个就起到了连接的作用。
    在这里插入图片描述
    两个字典当中的数据,如果要合并起来,就是从一个合并到另外一个里面去,就通过字典的update方法进行。

8、实例应用(统计各种蔬菜的总金额)

在这里插入图片描述
显示的是每一天每一种蔬菜的销售金额,我们要根据产品这一列来统计一下每一种蔬菜它的总金额是多少,比方说白菜有4项金额共4230,其他菜也都是这样统计。
我们把产品当作字典里面的键名,把金额当作键对应的那个值,然后我们把产品这一列中的数据,对应放到字典当中去判断,如果这些产品键名在字典当中存在,则将它对应的金额进行累加,如果不存在的话我们则将当前的这一条给它写进去;
比方说第一次的话白菜在字典当中不存在,我们把它的键名和值写进去,第二次的菠菜不存在也给它写进去,第三次的西红柿不存在也写进去,第四次的白菜这个键名此时在字典当中已经存在了,就将第一次写进去的白菜的金额加上现在要写进去的白菜的金额,加起来的值赋给白菜这个键;
也就是说我们会做两个操作,如果字典当中存在这个键名,我们就做修改,这个地方的修改就是做累加;如果不能存在我们就创建新的键名以及对应的值。
所以,我们首先第一步是打开这个工作簿,然后把对应的产品和金额这两列数据进行遍历,并进行判断。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接着我们就要判断这些数据在字典当中存不存在

  • 字典的keys()方法能够提取字典当中所有的键名,这样就可以判断我们遍历的每一个蔬菜名称在字典当中存不存在:
    在这里插入图片描述

  • 我们调试来看一下:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    菠菜以此类推:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    由于此时白菜已经存在,所以就进行累加了,以此类推,后面的都是同样的操作:
    在这里插入图片描述

  • 我们把if语句当中的item[1]改为列表,这样累加就变成了list的连接,方便你们更清楚的观察变化:
    在这里插入图片描述
    在这里插入图片描述

  • 这里出错是由于else子句当中的item[1]是float,所以在第二次判断白菜存在进行累加的时候,这个float不能加上list,两个不同的数据结构不匹配,所以修改else子句当中的item[1]也为list。
    在这里插入图片描述

  • 或者改成一次性把各种蔬菜的所有的数据打印出来:
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    凡是键名等于白菜的,我就把它的金额给它连接、合并起来,方便观察。

在这里插入图片描述
在这里插入图片描述
总结,这个字典里面如果键名有相同的我就给它累加,如果有新的话它就新增,这样就可以统计出各种蔬菜的总金额了。

在这里插入图片描述

9、字典的查询

这节课所讲的字典的查询,就是说我们怎样从字典里面提取我们想要的这个数据。

判断是否存在

你指定的键在字典当中是否存在。
在这里插入图片描述

单值查询

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

多值查询

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

  • 将所有的键和值的对应,即键名和值同时提取出来:

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

  • 也可以把提取出来的数据转换成元组
    在这里插入图片描述
    在这里插入图片描述

在这里插入图片描述

10、实例应用(统计各日期的销售数据)

统计出指定日期的销量的最大值、最小值、总计、个数等等。
在这里插入图片描述
我们要统计的就是某一天它的最高销量、最低销量,总销量,一共有多少条记录。
我们希望先把它们装到一个字典容器里面,把日期作为键名,销量作为它的值。
从第2行开始循环每一行,取第1个单元格里面的值,再取第2个单元格里面的值,当然一次性读取出来也行。
由于我们要把A列日期变成键,B列对应的数据变成值:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
我们不要循环打印那么多次,一次性打印出来:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
上图for循环中的d代表字典,如果没有指定要循环字典的什么的话,默认就代表循环的是它的键名:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这样的话,我们进行数值的累加、最大最小值、个数:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

11、字典的循环

字典的循环就是,我们有一个字典,如果需要把字典里面的数据取出来,该怎么操作。

普通循环

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

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

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

  • 我们不想通过循环的方式操作,像d.keys()和d.values,以及d.items()都是可迭代的对象,如果我不想像上面那样一个一个的显示出来,我还是想把它们显示到一个容器里面,例如显示在元组或列表里面,我们该如何完成呢?
  • 这个时候我们就要用推导的方式来完成。

字典在列表中的推导

  • 比方说我们把字典当中的键全部在一个列表当中推导:
    在这里插入图片描述
    在这里插入图片描述
    可以看出来,它并不是单个值单个值的取出来,它其实是直接把键取出来放在一个列表当中。

在这里插入图片描述
在这里插入图片描述
如果放在一个元组里面的话,它是一个迭代器,是不能直接显示出来的,你还得在外层用list转换一下:
在这里插入图片描述
在这里插入图片描述
或者是加一个tuple也可以:
在这里插入图片描述
在这里插入图片描述
我们后面都以列表为准:
在这里插入图片描述
在这里插入图片描述
不但可以像上面那样把它转成一个列表,而且在转换的过程当中可以添加其他的一些东西:
在这里插入图片描述
在这里插入图片描述
这种就是字典在列表、元组当中的一个推导,字典当中的某一部分数据在列表或者元组当中推导出来,形成一个新的数据。

在这里插入图片描述

字典推导式

对已经存在的字典重新推导

就是在字典当中进行推导。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
对已经存在的字典重新推导,把字典当中后面的值当作键名,把字典当中前面的键作为值,形成一个新的字典:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
即,你可以在推导的时候,对这个字典进行重新的改造。

在这里插入图片描述

将其它结构的数据推导为字典

在这里插入图片描述
在这里插入图片描述
当然,你在做的过程中还可以加工一下数据,改造这个字典:
在这里插入图片描述
在这里插入图片描述
当然,我们用前面讲过的dict.fromkeys方法来批量的转也是可以的,但是没有推导式简洁灵活。

在这里插入图片描述
最终,我们就是要利用字典推导式把我们的数据变成字典,这就是我们的目的,这就是字典推导式的作用。

12、实例应用(统计各省各公司总业绩)

实例要求:把各个省份下面所有公司的总金额汇总出来

我们要统计一下各省,每个省不止一个公司,每个公司不止一张订单号,也就是不止一个金额,我们就是要将每个省、每个公司的金额给加起来,最后,我们要以省的名字创建工作表,把那个省下面的所有的公司的总金额给写到对应的工作表下面。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
只要公司名不同,都要汇总各自公司的总金额,并且要把公司名和总金额写到新建的对应省份工作表的下面。

第一步,把每个省份的每个公司的总金额给汇总出来

在这里插入图片描述

  • 我们要把省份、客户名称作为字典的键,金额作为字典的值。
    先来读取出每一行的数据。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

取第0列、第1列的数据,通过元组的方式作为字典的键

通过ws.row_values方法读取每一行的数据成为一个列表,取第0、1列作为字典的键,第5列作为它的值,我们如果要把第0、1列作为字典的键的话,就要用元组的方式在这里插入图片描述,然后判断该键是否在字典当中存在:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

提取一共有多少个省份

但是有些省份有好几个公司,比如说北京就有好几个公司,那么我们就要这好几个公司的记录都写在一个工作表里面,但是这时候你就需要知道一共有多少个省,怎么做呢?
在这里插入图片描述
在这里插入图片描述
可以看到这个key是个元组,但是这个元组里面有两个值,所以你可以用x, y这种形式把这个元组给分开:
在这里插入图片描述
在这里插入图片描述
其实我只要省份就可以:
在这里插入图片描述
在这里插入图片描述

对重复的省份名称进行去重

看上图说明安徽有1个公司,北京有7个公司,所以会出现7次北京,然后我们要去重,因为我们一会要以省名来创建工作表,那么怎么去重呢?
我们可以将获得的上图这个列表传给dict.fromkeys方法,做成一个字典,这样就做了一个过滤,去重了:
在这里插入图片描述
在这里插入图片描述
我们只需要键这一部分,None这部分不需要:
在这里插入图片描述
在这里插入图片描述
等一下我们在创建工作表的时候,就可以根据这个l1里面的这些省份名字来创建了工作表了。

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

接下来,我们要把各省份工作表里面的公司记录给弄出来

在这里插入图片描述
等一下我要写到工作表当中的部分,就是上图所选中的这三个数据。
在这里插入图片描述

接下来就要创建工作表

在这里插入图片描述
创建好新的工作簿后,接下来在循环省份名字的时候,创建每个省份的工作表:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  • 注意,循环写完一个省份的数据之后,要记得把行号r归0,再进行下一个省份的写入,因为你不能让下一个省份表从r的累计值那一行开始写入,那样的话位置不正确,前面会有越来越多的空行。

在这里插入图片描述

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

  • 1
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值