
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}