Python网络爬虫技术与实战
上QQ阅读APP看书,第一时间看更新

1.5.4 字典

字典是包含若干“键:值”元素的无序可变序列,字典中的每个元素都包含用冒号分隔的“键”和“值”两部分,表示一种映射或对应关系,也称关联数组。定义字典时,每个元素的“键”和“值”之间用冒号分隔,不同元素之间用逗号分隔,所有元素都放在一对大括号“{ }”内。

字典中元素的“键”可以是Python中的任意不可变数据,例如整数、实数、复数、字符串、元组等类型的可散列数据,但不能使用列表、集合、字典或其他可变类型作为字典的“键”。另外,字典中的“键”不允许重复,而“值”是可以重复的。使用内置字典类型dict时不要太在意元素的先后顺序。

1.字典的创建和删除

字典的创建应当指定“键值对”的条目而不是值。可以通过一对花括号“{ }”将这些条目括起来创建一个字典,每一个条目都有一个关键字,然后跟着一个冒号,再跟着一个值。每一个条目都用逗号分隔开。创建两条目字典,字典中的每一个条目的形式都是key:value。可以使用del删除字典。

【例1-41】创建字典示例


>>> dict = {'name':'joe','age':18}  # 通过键值对创建dict字典

>>> a_dict = {}                     # 创建空字典
>>> a_dict=dict()

dict()方法除了可以创建一个空字典外,还可以通过已有数据快速创建字典。主要有以下两种形式。

(1)通过映射函数创建字典

通过映射函数创建字典的语法如下:


dictName=dict(zip(list1,list2))

·zip()函数:用于将多个列表或元组对应位置的元素组合为元组,并返回包含这些内容的zip对象。如果想获取元组,可以使用tuple()函数将zip对象转换成元组;如果想获取列表,可以使用list()函数将其转换成列表。

·list1:列表,指定要生成字典的键。

·list2:列表,指定要生成字典的值。如果list1和list2列表长度不同,则值与最短的列表长度相同。

利用映射函数创建字典的方法示例如下。

【例1-42】利用映射函数创建字典示例


>>> name = ["Joe","Mary"]
>>> age = [23,18]
>>> dictionary = dict(zip(name,age))
>>> print(dictionary)
{'Joe': 23, 'Mary': 18}

(2)通过给定的“键值对”创建字典

通过给定“键值对”创建字典的语法如下:


dictName=dict(key1=value1,key2=value2,...,keyn=valuen)

·key:表示元素的键,必须唯一,并且不可变。

·value:表示元素的值,可以是任何数据类型,不必是唯一的。

利用给定“键值对”创建字典的方法示例如下。

【例1-43】利用“键值对”创建字典示例


>>> dictionary = dict(Joe=23,Mary=18)
>>> print(dictionary)
{'Joe': 23, 'Mary': 18}

2.字典元素的访问

字典中的每个元素都表示一种映射关系或对应关系,以提供的“键”为下标就可以访问对应的“值”,如果字典中不存在这个“键”,则会抛出异常。字典对象提供了一个get()方法用来返回指定“键”对应的“值”,并且允许在指定的“键”不存在时返回特定的“值”。

【例1-44】访问字典中的元素示例


>>> a_dict = {'name': 'Joe','age': 23,'sex': 'male'}
>>> a_dict['name']                 # 指定的“键”存在,返回对应的值
'Joe'
>>> a_dict['score']                # 指定的“键”不存在,抛出异常
KeyError: 'score'

3.元素的添加和修改

当以指定“键”为下标来为字典元素赋值时,有两种含义:一种是该“键”存在,则表示修改该“键”对应的值;另一种是该“键”不存在,则表示添加一个新的“键值对”,也就是添加一个新元素。向字典中添加和修改元素的示例如下。

【例1-45】向字典中添加和修改元素示例


>>> a_dict = {'name': 'Joe','age': 23,'sex': 'male'}
>>> a_dict['age']=24              # 修改元素值
>>> a_dict
{'name': 'Joe', 'age': 24, 'sex': 'male'}
>>> a_dict['score'] = 98          # 添加新元素
>>> a_dict
{'name': 'Joe', 'age': 24, 'sex': 'male', 'score': 98}