龙空技术网

还不会使用Python中的字典?一文教会你所有的技巧

外星人玩Python 106

前言:

当前你们对“python字典加入”大概比较看重,大家都想要学习一些“python字典加入”的相关内容。那么小编同时在网上收集了一些有关“python字典加入””的相关资讯,希望咱们能喜欢,各位老铁们一起来学习一下吧!



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


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

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


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

前言

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


查找匹配的困境

如下个人信息数据定义:

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

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

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

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

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

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

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



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

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

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

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

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

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

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

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

看情况适用

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

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

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

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

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

快速判断是否存在

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

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

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

多个关键值

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

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

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

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

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


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




一对多也行?

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

如下是各个班的成绩:

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

代码如下:

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

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

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

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

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

直接定义字典的数据

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

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

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


总结

生成字典的方式:

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

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


标签: #python字典加入 #python连接字典