给妹子讲python-S01E02学会用字典-阿里云开发者社区

开发者社区> 技术小能手> 正文

给妹子讲python-S01E02学会用字典

简介: 字典和列表完全不同,字典里的对象是无序的,他是通过一对对的键和值来反映一种映射关系。字典里,每个键都是唯一的,我们可以通过键来存取对应的值,而不能像列表那样通过位置来索引。
+关注继续查看

【妹子说】上次讲了列表,今天接着讲讲字典吧。

首先我要说,字典这个容器类型真的非常好用,也非常重要。

字典和列表完全不同,字典里的对象是无序的,他是通过一对对的键和值来反映一种映射关系。字典里,每个键都是唯一的,我们可以通过键来存取对应的值,而不能像列表那样通过位置来索引。

首先来看看怎样用最简单的方法生成一个字典,先弄一个出来再说。

D = {
'name':{'first':'Bob', 'last':'Smith'},
'job' : ['dev','mgr'],
'age' : 0.5,
'addr': 'BeiJing'
}
print(D)

{'job': ['dev', 'mgr'], 'addr': 'BeiJing', 'name': {'first': 'Bob', 'last': 'Smith'}, 'age': 0.5}

从这个例子的输出结果我们可以看出,字典也是可以包含任意的数据类型,即所谓的异构性,甚至可以嵌套一个字典,同时从打印的结果看,字典里的各个元素确实没有什么顺序可言。

对字典值的读取和修改也很简单

D = {'food':'spam', 'quality':4, 'color': 'pink'}
print(D['food'])
D['sex'] = 'gender'
print(D)

spam
{'food': 'spam', 'color': 'pink', 'quality': 4, 'sex': 'gender'}

我们用‘food’键就可以读取其对应的值---字符串对象‘spam’,此外我们还可以原地增加‘sex’键以及对应的值,当然,也可以原地修改其他已有的键和值。

【妹子问】恩,可是我觉得这种方法很死板呀,他要求我们一个一个的把数据手动输入来构建字典,这样子感觉不是很方便呢

这个问题问的太好了。特别是当我们事先不知道字典有哪些键和值的时候,如果想利用在程序中动态获取的数据集来生成字典,上述方法就办不到了。

基于这种需求,我们再介绍其他几个生成字典的方法:

第一种方法:初始为空字典,动态填充新的键和值

D = {}
D['name'] = 'Bob'
D['job'] = 'dev'
print(D)

{'name': 'Bob', 'job': 'dev'}

重点是第二种方法,用列表动态生成字典。

一般来说字典的键是事先约定好的,比如姓名、性别、生日等等,而值往往是要在程序运行过程当中通过用户输入、网页数据抓取等不同手段动态获取的。本方法可以在获取值列表后动态生成一个字典。

key_list = ['a','b','c']
value_list = [11,22,33]
D = dict(zip(key_list, value_list))
print(D)

{'a': 11, 'c': 33, 'b': 22}

第三种方法,用键值对元组组成的列表构造字典。(元组我们后面要讲,就是这个圆括号)

D = dict([('aa',11),('bb',22),('cc',33)])
print(D)

{'cc': 33, 'aa': 11, 'bb': 22}

【妹子问】哦,有了这些好用的方法我就放心啦。还有一个问题:如果我有两个已经生成的字典,想要把他们合并应该怎么做呢?

做法很简单

D1 = {'a':1,'b':2, 'c':3}
D2 = {'c':8, 'd':9}
D1.update(D2)
print(D1)

{'c': 8, 'b': 2, 'a': 1, 'd': 9}

不过要注意,如果这两个字典中有冲突的键,那么会无规律的进行覆盖,所以应该避免这种情况

【妹子说】现在我明白在不同使用场景下如何来生成一个字典了,那我如果访问一个不存在的字典键,应该会报错吧

这么说也对,也不对。

我们具体看看对于键不存在这种情况下的处理技巧。

D = {'a':1,'b':2, 'c':3}
print(D['d'])

Traceback (most recent call last):
 File "E:/12homework/12homework.py", line 2, in <module>
print(D['d'])
KeyError: 'd'

用这种直接访问的方式,如果键不存在就会报错,但是可以引入in判断方法进行避免

D = {'a':1, 'b':2}
print('c' in D)
if not 'c' in D:
print('missing')

False
Missing

其实,有一种更高级的方法实现了上述的判断功能。那就是get方法,get方法中第二个参数指的是键不存在时指定返回的默认值,如果不设置这个值,则返回None

D = {'a':11,'b':22, 'c':33}
print(D.get('d',0))

0

【妹子又问了】我们在实际使用字典时,很多情况下不应该这么一个一个的手动访问字典键吧,比如我想一次性获取所有的键,应该怎么做?

这又是一个好问题,

我们可以用下面的方法来一次性获取包含所有键的列表:

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
print(list(D.keys()))

['b', 'a', 'd', 'e', 'c']

D.Keys方法返回的是一个迭代器,而不是直接就给出一个列表,关于迭代器后面会专门讲的,这里只需记住此处将迭代器作为参数来初始化一个list,可以一次性生成所有的键,并将其打印出来。

想获取值的列表,处理方法也十分类似

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
print(list(D.values()))

[11, 33, 44, 55, 22]

我们还可以用同样类似的方法同时获取键值对的列表

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
print(list(D.items()))

[('d', 44), ('a', 11), ('c', 33), ('e', 55), ('b', 22)]

【妹子说】和列表相类比,下面是不是也得说说字典的删除和排序问题?

对,字典和列表大同小异。而且删除也是利用del和pop两种方法

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
del D['a']
print(D)

{'b': 22, 'c': 33, 'e': 55, 'd': 44}

pop方法是在删除指定键对应的元素的同时,返回这个键所对应的值

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
print(D.pop('a'))
print(D)

11
{'b': 22, 'e': 55, 'd': 44, 'c': 33}

【妹子反问我了】我记得你最开始的时候说,在字典里对象是无序的呀,那怎么还存在排序的概念呢?

原来是挖坑在等我呀,字典的排序操作实际上是在对键进行排序,他返回一个排好序的键的列表

D = {'a': 11, 'b': 22, 'c': 33, 'd': 44, 'e': 55}
print(sorted(D))
print(sorted(D.keys()))

['a', 'b', 'c', 'd', 'e']
['a', 'b', 'c', 'd', 'e']

这里埋一个伏笔,内置函数sorted接受的都是可迭代对象,这个反复出现的概念后面我们一定会好好谈谈。

原文发布时间为:2018-07-19
本文作者:酱油哥
本文来自云栖社区合作伙伴“Python爱好者社区”,了解相关信息可以关注“Python爱好者社区

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Vue 仿钉钉流程图(流程节点绘制 vue+Ant【如果用其他UI库需要替换几个组件】 附 demo)
# [这里是git地址](https://gitee.com/xiaoyaoluntian/imitating-dingding-flow-chart/tree/comdemo/)
6 0
Vue 集成腾讯地图基础api Demo集合(基础地图引入与展示模块,地址逆解析,3D/2D切换 ,位置服务,mark标记)
Vue 集成腾讯地图基础api Demo集合(基础地图引入与展示模块,地址逆解析,3D/2D切换 ,位置服务,mark标记)
7 0
数据类型-数值和字符串 | 学习笔记
快速学习数据类型-数值和字符串。
5 0
作用域及作用域链 | 学习笔记
快速学习作用域及作用域链。
5 0
代码注释 | 学习笔记
快速学习代码注释。
9 0
求数组元素的和 | 学习笔记
快速学习求数组元素的和。
6 0
【Elastic Engineering】Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana
Kibana:如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana
10 0
函数的返回值 | 学习笔记
快速学习函数的返回值。
6 0
函数当作参数2 | 学习笔记
快速学习函数当作参数2。
6 0
+关注
技术小能手
云栖运营小编~
7208
文章
9
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载