Python玩数据入门必备系列(7):最会匹配的集合,字典


Python玩数据入门必备系列(7):最会匹配的集合,字典


此系列文章收录在公众号(建议按顺序阅读本系列文章) : 数据大宇宙 > Python入门必备 > 必备知识


转发本文并私信我"python",即可获得Python资料以及更多系列文章(持续更新的)

最近有许多小伙伴问我要入门 Python 的资料,还有小伙伴完全没有入门 Python 就直接购买了我的 pandas 专栏。因此我决定写几篇 Python 数据处理分析必备的入门知识系列文章,以帮助有需要的小伙伴们更好入门。


不拆分啥初级中级高级,一个专栏直接带你入门到高级应用,从数据处理到数据分析!!


前言

我们有一批个人信息(姓名、年龄等),在 Python 中使用元组+列表管理这些数据最适合不过。但是如果需要从里面找出指定名字的信息呢?每次查找都遍历吗?这显然不太科学。今天就来学下解决这一问题的大利器。



查找匹配的困境

如下个人信息数据定义:

Python玩数据入门必备系列(7):最会匹配的集合,字典

  • 这相当于本系列之前学过的列表 + 元组 的知识点应用。
  • 使用元组承载不同类型的数据(一个人的各种类型的信息)
  • 使用列表承载同类型的数据(多个人的信息)

如何找出 A3 这个人的信息?使用遍历+判断即可:

Python玩数据入门必备系列(7):最会匹配的集合,字典

  • 行7-9:遍历每行记录,并处理。注意这里的代码实际被执行了3次,因为有3行记录
  • 行8:变量 r 表示每一行数据(是一个元组),通过 r[0] 访问元组第一个值(名字),做判断
  • "嗯,这符合 Python 的宣传口号,简单,直接!"
  • 我觉得还可以,但是如果需要多次查找,这代码就太麻烦,一点都不清晰

这代码表达的语义相当于,我聘请一位助手,教会他如下技能:

  • 给你一个数据表和一个名字
  • 你到数据表中一行行中的名字与我给的名字是否相同
  • 相同你就给把那一行给我

难道这语义有问题吗?问题在于找一次的过程太慢了!如果要找多次,这会等到啥时候!

难道这助手就不能长点脑子,给我把名字记忆下来吗?下次再去找的时候就不需要再一行行去翻了。



Python玩数据入门必备系列(7):最会匹配的集合,字典


字典就是一个带脑子的小助手

我希望代码的语义(跟助手的说话)如下:

  • 给你一个数据表,你给我把名字和对应的行数记住(用脑子)
  • 下次我给你一个名字,你要马上想出来对应的行数,然后把那一行数据给我

现在来看看代码怎么表达:

Python玩数据入门必备系列(7):最会匹配的集合,字典

  • 行7:mapping = {} 定义一个空字典,此时"助手"大脑一片空白
  • 行9:仍然需要遍历一次所有的记录
  • 行11:mapping[name] = r ,把某个名字记下来,并且把该行记录 r 给对应上
  • 行14:mapping['A2'] 即可立刻得到 "A2" 对应的数据(是一个元组)

你可以把字典想象成一个数据表:

Python玩数据入门必备系列(7):最会匹配的集合,字典

  • key 列,保存了匹配查找时的关键值
  • value 列,保存了 key 对应的数据

看起来使用查找匹配用上字典真好,那么是否只要是查找匹配的任务我都用上字典就好了?


看情况适用

从代码可以看到,使用字典仍然需要遍历一次数据表,如果你只是从不多的数据里面查找一两次,那么真不需要使用字典。

反过来说,如果需要多次匹配查找,那么使用字典就是一个不错的选择。

看到这里,你还能发现使用字典的任务里面有一个特征?

字典只能处理"相等"匹配,你不要指望他能给你解决类似"找出大于某个日期的记录"这样子的任务。

看到这里,又感觉字典没啥用了。其实除了匹配查找他还能干一些事情。


快速判断是否存在

由于"助手"已经把名字记忆下来,因此如果你问他"张三是否在数据表中?"这样的问题,他也能快速给你答案:

Python玩数据入门必备系列(7):最会匹配的集合,字典

  • 行14:'张三' in mapping ,判断某个值是否在字典的 key 列中
  • 在 Python 中, xx in 集合 ,是一个通用表达某个值是否在一个集合中的语义。由此你可以推断,此语法同样可以用在列表和元组中

但是,如果需要根据多列的信息定位一行数据,似乎字典做不到?


多个关键值

之前的例子一直只让"助手"记忆"名字"这么一个值的数据,其实他能记住多个值组成的数据。如下一个人地区表:

Python玩数据入门必备系列(7):最会匹配的集合,字典

  • 希望"助手"记住 年级 + 班级,快速得到分数

"年级"与"班级"是2种不同性质的数据,此时你应该马上想到元组:

Python玩数据入门必备系列(7):最会匹配的集合,字典

  • 行12:r[:2] ,是从一个元组中使用切片,取开头至索引2(不包含)之间的元素

此时查找同样需要给他一个元组:

Python玩数据入门必备系列(7):最会匹配的集合,字典


上面是一个 key("年级"与"班级"的元组) 对应一行数据,那么是不是字典不能匹配多行数据?




Python玩数据入门必备系列(7):最会匹配的集合,字典


一对多也行?

答案是,字典只能一对一匹配,但是不代表不能完成一对多匹配输出。

如下是各个班的成绩:

Python玩数据入门必备系列(7):最会匹配的集合,字典

  • 我希望给出一个班别,快速得到该班的所有学生的记录(多行)

代码如下:

Python玩数据入门必备系列(7):最会匹配的集合,字典

  • 行14:判断班级值是否在字典,如果存在,表明此时已经执行过 行17 的代码了。就是字典已经存在某个班级的key,此时对应的value必然是列表(因为 行17 我们放入了一个列表)。因此只需要往这个列表中追加记录即可(列表的 append 方法)
  • 行17:当某个班级的记录第一次出现时,就会执行到这里,只需要把一个包含这行记录的 r 的列表,放入字典的 value 即可

那么此时查找某个班级的记录,得到的结果将是一个列表:

Python玩数据入门必备系列(7):最会匹配的集合,字典


是否感觉代码中关于添加数据到列表的那段代码有点难理解?

这不是因为你是初学者的关系,其实是代码真写的不好。有没有一种语义直接是"按数据表中的班级,分组学生记录到字典吧"这样子的代码呢?

真有(不是用 pandas 噢),请关注本入门系列,后面就会介绍(别揍我,一下子知道太多机密有危险)!


直接定义字典的数据

有时候字典的数据比较简单,不需要从其他地方转换得到,我们希望简单定义即可。我相信认真阅读文章的你,已经不知不觉学会了。

下面直接看个例子就可以秒懂:

Python玩数据入门必备系列(7):最会匹配的集合,字典

  • 用 {} 表示一个字典
  • 在 {} 里面填充东西,表示字典中的数据。由于字典中每一行数据都存在 key 与 value,因此使用 {key:value} 表示,用冒号把 key 与 value 分隔开来
  • 字典中的行之间用逗号分隔。 {key1:value1 , key2:value2}



总结

生成字典的方式:

  • {key1:value1,key2:value2}
  • 某个key in 字典 ,判断字典是否存在指定key,返回的是 True 或 False (是或不是)

有任何疑问,私信我"python"



分享到:


相關文章: