首页 - 文章教程 - 正文

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 字典嵌套

有时在开发程序中需要将一系列字典存储在列表中,或将列表作为值存储在字典中,这种就是嵌套,下面首先演示字典列表,就是在列表中存储的都是字典:

Screenshot from 2018-05-07 14:08:58.png

同样我们有时也需要将列表存储在字典中,例如在存储一个人的基本信息时需要保存喜欢吃的水果,这个水果就是一个列表形式:

>>> 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小课堂的微信群与更多志同道合的小伙伴一起学习和交流!

1516851765432601.jpg

发表评论