3.学习python字典
0x00 什么是python字典
python的字典是一种可变容器模型,可以存储各种数据类型对象,如字符串、数字、元组等其他容器模型。字典由键和对应值成对组成(Key:Value),字典也被称作关联数组或哈希表。字典的每个键值对用冒号(:)分割,每个对之间用逗号,分割,整个字典包括在花括号{}中。字典可以理解成跟json中的键值对差不多,理解了字典后就能更准确的为各种真实物体建模,模拟现实世界中的情形。
0x01 初步使用字典
字典由一系列键值对组成,每个键都与一个值相关联,可以使用键来访问与之相关联的值,需要注意的是键在字典中必须是独一无二的,值可以重复,下面是一个简单的例子:
corvin@workspace:~$ python3.4 Python 3.4.3 (default, Nov 28 2017, 16:41:13) [GCC 4.8.4] on linux Type "help", "copyright", "credits" or "license" for more information. >>> info = {'name': 'corvin', 'age': 20, 'locate': 'shanghai'} >>> print(info) {'locate': 'shanghai', 'age': 20, 'name': 'corvin'} >>> print(info['name']) corvin >>> print("now " +info['name']+ " is locate: " + info['locate']) now corvin is locate: shanghai >>>
由上面示例可知,要获取与键想关联的值,需要通过字典名和方括号内的键来得到相应的值。字典是一种动态结构,可随时在其中添加新的键值对,若想添加新键值对,可依次指定字典名和方括号括起来的键,往该键赋相应值即可。
>>> info = {'name': 'corvin', 'age': 20, 'locate': 'shanghai'} >>> info['sex'] = 'male' >>> print(info) {'locate': 'shanghai', 'age': 20, 'name': 'corvin', 'sex': 'male'}
通过增加新键值对后打印输出发现打印顺序与原始添加顺序不同,这是因为python不关心键值对的添加顺序,只关心键值对之间的关联对应关系是否正确。如果发现添加进字典中的键值对有问题,我们还可以来修改其中的值或者直接干脆将键值对删除,接下来通过实际操作来认识如何修改值和删除键值对:
>>> info = {'name': 'corvin', 'age': 20, 'locate': 'shanghai'} >>> info['age'] = 25 >>> print("now " + info['name'] + " is " + str(info['age']) + " years old") now corvin is 25 years old >>> del info['locate'] >>> print(info) {'age': 25, 'name': 'corvin'}
使用del语句将字典中键值对删除时,必须指定字典名和要删除的键,注意使用del删除的键值对将彻底从当前字典中消失。
0x02 遍历字典
一个字典中可能包含有数百万个键值对,因此就需要可以快速的在字典中查找到指定的数据,我们可以通过遍历来找到指定的数据,首先来看如何来遍历字典中所有键值对:
>>> info = {'name': 'corvin', 'age': 20, 'locate': 'shanghai'} >>> for key, value in info.items(): ... print("\nkey:" + key) ... print("value:" + str(value)) ... key:locate value:shanghai key:age value:20 key:name value:corvin
需要注意在遍历字典时,键值对的返回顺序与存储顺序不同,python不关心键值对的存储顺序,只关注键值对的对应关系。如果只需要字典中的键,不需要对应的值时就需要keys()方法了,在遍历字典时,会默认的遍历所有的键,但是显示的使用keys()方法会让代码更容易理解。在遍历中如果想keys按照字母表的顺序来遍历的话,需要用sorted()方法即可,如下所示:
>>> info = {'name': 'corvin', 'age': 20, 'locate': 'shanghai'} >>> for key in info.keys(): ... print(key.upper()) ... LOCATE AGE NAME >>> for key in info: ... print(key.title()) ... Locate Age Name >>> for key in sorted(info.keys()): ... print(key) ... age locate name
现在可以遍历字典中的所有值,可以使用values()方法即可,它返回的是一个列表:
>>> info = {'name': 'corvin', 'age': 20, 'locate': 'shanghai'} >>> for value in info.values(): ... print(value) ... shanghai 20 corvin
0x03 字典嵌套
有时在开发程序中需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这种就是嵌套,下面首先演示字典列表,就是在列表中存储的都是字典:
同样我们有时也需要将列表存储在字典中,例如在存储一个人的基本信息时需要保存喜欢吃的水果,这个水果就是一个列表形式:
>>> info = {'name': 'corvin', 'age': 20, 'locate': 'shanghai', 'fruit':['apple', 'banana'],} >>> print(info) {'locate': 'shanghai', 'age': 20, 'fruit': ['apple', 'banana'], 'name': 'corvin'}
最后也是比较复杂的用法,我们可以在字典中存储字典:
>>> members = { 'corvin':{'name': 'corvin', 'age':20,}, 'will':{'name':'will','age':30,}} >>> for name, info in members.items(): ... print("\nUsername: " + name) ... print("Info-> name:" + info['name']) ... print("Info-> age:" + str(info['age'])) ... Username: corvin Info-> name:corvin Info-> age:20 Username: will Info-> name:will Info-> age:30
0x04 字典内置函数和方法
首先来介绍字典内置的函数,总共有三个,分别如下进行演示:
len(dict):用于计算当前字典内具有几个元素(键值对);
str(dict):使用字符串形式来将字典可以打印输出;
type(dict):返回当前数据的类型;
>>> corvin = {'name': 'corvin', 'age': 20, 'locate': 'shanghai'} >>> len(corvin) 3 >>> print(str(corvin)) {'locate': 'shanghai', 'age': 20, 'name': 'corvin'} >>> print(corvin) {'locate': 'shanghai', 'age': 20, 'name': 'corvin'} >>> type(corvin) <class 'dict'>
接下来介绍字典内置的方法:
(1)dict.clear():删除字典内所有的键值对
>>> corvin = {'name': 'corvin', 'age': 20, 'locate': 'shanghai'} >>> print(corvin) {'locate': 'shanghai', 'age': 20, 'name': 'corvin'} >>> corvin.clear() >>> print(corvin) {}
(2)dict.copy():返回字典的一个浅拷贝
>>> corvin = {'name': 'corvin', 'age': 20, 'locate': 'shanghai'} >>> new_corvin = corvin.copy() >>> print(new_corvin) {'locate': 'shanghai', 'age': 20, 'name': 'corvin'}
那直接赋值和浅拷贝的区别是什么呢,对于赋值来说就是引用,新对象与原始对象相同,对于使用copy的浅拷贝,只复制一级目录,对于二级目录仍然是引用,由下面测试代码可以看出对于test_2的name并没有给换成新值admin,因为name是一级目录,但是num却将2删除,因为num是二级目录仍然是引用。
>>> corvin = {'name':'corvin', 'num':[1,2,3]} >>> test_1 = corvin >>> test_2 = corvin.copy() >>> corvin['name']='admin' >>> corvin['num'].remove(2) >>> >>> print(corvin) {'name': 'admin', 'num': [1, 3]} >>> print(test_1) {'name': 'admin', 'num': [1, 3]} >>> print(test_2) {'name': 'corvin', 'num': [1, 3]}
(3)dict.get(key, defaultValue):从字典中获取指定的key相对应的值,若该key不存在则返回设置的defaultValue:
>>> corvin = {'name': 'corvin', 'age': 20, 'locate': 'shanghai'} >>> corvin.get('locate', 'unknown') 'shanghai' >>> corvin.get('sex', 'unknown') 'unknown'
(4)dict.pop(key, defaultValue):从字典中删除指定的key及其对应value,如果没有找到相应的key,则返回defaultValue:
>>> corvin = {'name': 'corvin', 'age': 20, 'locate': 'shanghai'} >>> print(corvin.pop('age', 'unknown')) 20 >>> print(corvin) {'locate': 'shanghai', 'name': 'corvin'} >>> print(corvin.pop('sex', 'unknown')) unknown >>> print(corvin) {'locate': 'shanghai', 'name': 'corvin'}
0x05 参考资料
[1].Eric Matthes 著 袁国忠 译. Python编程从入门到实践[M]. 北京:中国工信出版社 人民邮电出版社. 2017. 81-99
[2].Python3字典 菜鸟教程[OL]. http://www.runoob.com/python3/python3-dictionary.html
0x06 问题反馈
大家在按照教程操作过程中有任何问题,可以关注ROS小课堂的官方微信公众号,在公众号中给我发消息反馈问题即可,我基本上每天都会处理公众号中的留言!当然如果你要是顺便给ROS小课堂打个赏,我也会感激不尽的,打赏30块还会邀请进ROS小课堂的微信群与更多志同道合的小伙伴一起学习和交流!