给妹子讲python-S01E02python容器的使用技巧之字典

欢迎关注公众号:python数据科学家

【要点抢先看】

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 2in <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()))

[1133445522]
复制代码

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

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-S01E02python容器的使用技巧之字典》

    原文作者:python入门
    原文地址: https://juejin.im/post/5b3b7c606fb9a04fad39f06c
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞