查看原文
其他

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

给妹子讲python Python爱好者社区 2019-04-07

作者:酱油哥       《给妹子讲python》专栏作者
公众号: python数据科学家 / 清华程序猿
知乎专栏:
https://zhuanlan.zhihu.com/c_147297848



前文传送门:

  给妹子讲python-S01E01好用的列表

【要点抢先看】

1.字典的动态生成方法及字典的合并
2.字典键不存在时的处理技巧
3.一次性高效获取键、值列表方法举例
4.字典的删除与排序

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

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

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

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

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接受的都是可迭代对象,这个反复出现的概念后面我们一定会好好谈谈。

【妹子说】恩,今天讲的真挺多的,我发现字典挺有特色的,用法也确实挺灵活的,下一集再说说元组呗。

Python爱好者社区历史文章大合集

Python爱好者社区历史文章列表(每周append更新一次)

福利:文末扫码立刻关注公众号,“Python爱好者社区”,开始学习Python课程:

关注后在公众号内回复“课程”即可获取:

小编的Python入门免费视频课程!!!

【最新免费微课】小编的Python快速上手matplotlib可视化库!!!

崔老师爬虫实战案例免费学习视频。

陈老师数据分析报告制作免费学习视频。

玩转大数据分析!Spark2.X+Python 精华实战课程免费学习视频。


    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存