Python算法设计与分析从入门到精通
上QQ阅读APP看书,第一时间看更新

3.4 字典与集合

字典是Python中的一种数据结构,它无序、可变,保存的内容以键-值对的形式存放。Python中的字典类似于我们日常生活中的新华字典,它把拼音和汉字关联起来,通过音节表我们可以快速找到想要的汉字。其中,新华字典里的音节表相当于键(key),对应的汉字相当于值(value)。键是唯一的,值可以有多个。字典在定义一个包含多个命名字段的对象时很有用。

说明

Python中的字典相当于Java或者C++中的Map对象。

字典的主要特征如下:

 通过键而不是通过索引来读取。字典有时也称为关联数组或者散列表(hash),它通过键将一系列的值联系起来,这样就可以通过键从字典中获取指定项,但不能通过索引来获取。

 字典是任意对象的无序集合。字典是无序的,各项是从左到右随机排序的,即保存在字典中的项没有特定的顺序。这样可以提高查找顺序。

 字典是可变的,且可以任意嵌套。字典可以在原处增长或者缩短(无须生成一份备份),且支持任意深度的嵌套(即其值可以是列表或其他字典)。

 字典中的键必须唯一。不允许同一个键出现两次,如果出现两次,则后一个值会被记住。

 字典中的键不可变。可以使用数字、字符串或者元组,但不能使用列表。

3.4.1 字典的定义

定义字典时,每个元素都必须包含两部分—键和值。例如,一个保存水果信息的字典,键可以是水果名称,值可以是水果价格,如图3.45所示。

图3.45 字典示意图

创建字典时,在键和值之间使用冒号分隔,相邻两个元素使用逗号分隔,所有元素放在一对大括号“{}”中。语法格式如下:

dictionary = {'key1':'value1', 'key2':'value2', …, 'keyn':'valuen',}

参数说明:

 dictionary:字典名称。

 key1,key2,…,keyn:元素的键。必须是唯一的,并且不可变。可以是字符串、数字或者元组。

 value1,value2,…,valuen:元素的值。可以是任何数据类型,不要求唯一性。

例如,创建一个保存通讯录信息的字典,可以使用下面的代码:

dictionary = {'qq':'84978981','明日科技':'84978982','无语':'0431-84978981'}
print(dictionary)

执行结果如下:

{'qq': '84978981', 'mr': '84978982', '无语': '0431-84978981'}

同列表和元组一样,也可以创建空字典。在Python中,可以使用下面两种方法创建空字典。

dictionary = {}
dictionary = dict()

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

1.通过映射函数创建字典

语法格式如下:

dictionary = dict(zip(list1,list2))

参数说明:

 dictionary:字典名称。

 zip()函数:用于将多个列表或元组对应位置的元素重新“打包”,组合为新的元组,并返回包含这些内容的zip对象。如果想得到元组,可以将zip对象使用tuple()函数进行转换;如果想得到列表,则可以使用list()函数进行转换。

 list1:一个列表,用于指定待生成字典的键。

 list2:一个列表,用于指定待生成字典的值。如果list1和list2的长度不同,则与最短的列表长度相同。

2.通过给定的关键字参数创建字典

语法格式如下:

dictionary = dict(key1=value1,key2=value2,…,keyn=valuen)

参数说明:

 dictionary:字典名称。

 key1,key2,…,keyn:表示参数名,必须是唯一的,并且符合Python标识符的命名规则。该参数将被转换为字典的键。

 value1,value2,…,valuen:表示参数值,可以是任何数据类型,不要求必须唯一。该参数将被转换为字典的值。

例如,将名字和星座以关键字参数的形式创建一个字典,可以使用下面的代码:

dictionary =dict(绮梦 = '水瓶座', 冷伊一 = '射手座', 香凝 = '双鱼座', 黛兰 = '双子座')
print(dictionary)

执行结果如下:

{'绮梦': '水瓶座', '冷伊一': '射手座', '香凝': '双鱼座', '黛兰': '双子座'}
3.通过fromkeys()方法创建

还可以使用dict对象的fromkeys()方法创建值为空的字典,语法如下:

dictionary = dict.fromkeys(list1)

参数说明:

 dictionary:字典名称。

 list1:作为字典的键的列表。

例如,创建一个只包括名字的字典,可以使用下面的代码。

执行结果如下:

{'绮梦': None, '冷伊一': None, '香凝': None, '黛兰': None}

另外,还可以通过已经存在的元组和列表创建字典。例如,创建一个保存名字的元组和保存星座的列表,通过它们创建一个字典,可以使用下面的代码:

执行结果如下:

{('绮梦', '冷伊一', '香凝', '黛兰'): ['水瓶座', '射手座', '双鱼座', '双子座']}

如果将作为键的元组修改为列表,再创建一个字典,代码如下:

执行结果如图3.46所示。可见,错误出现在代码的第3行,用列表作为字典的键值时产生了异常。

图3.46 将列表作为字典的键时产生的异常

3.4.2 遍历字典

字典是以键-值对的形式存储数据的。Python提供了遍历字典的方法,通过遍历可以获取字典中的全部键-值对。

使用字典对象的items()方法可以获取字典的键-值对列表。其语法格式如下:

dictionary.items()

其中,dictionary为字典对象;返回值为可遍历的(键-值对)的元组列表。

要想获取到具体的键-值对,可以通过for循环遍历该元组列表。例如,定义一个字典,通过items()方法获取键-值对的元组列表,并输出全部键-值对,代码如下:

执行结果如下:

('qq', '84978981')
('明日科技', '84978982')
('无语', '0431-84978981')

上面的示例得到的是元组中的各个元素。如果想获取到具体的键和值,可以使用下面的代码进行遍历:

01  dictionary = {'qq':'4006751066','明日科技':'0431-84978982','无语':'0431-84978981'}
02  for key,value in dictionary.items():
03      print(key,"的联系电话是",value)

执行结果如下:

qq 的联系电话是 4006751066
明日科技 的联系电话是 0431-84978982
无语 的联系电话是 0431-84978981

说明

Python中,字典对象还提供了values()和keys()方法,用于返回字典的值和键列表。其使用方法同items()方法类似,需要通过for循环遍历该字典列表,获取对应的值和键。

3.4.3 集合简介

Python提供了两种创建集合的方法,一种是直接使用{ }创建;另一种是通过set()函数将列表、元组等可迭代对象转换为集合。

1.使用赋值运算符直接创建集合

在Python中,创建set集合可以像创建列表、元组和字典一样,通过直接将集合赋值给变量来实现。语法格式如下:

setname = {element 1,element 2,…,element n}

参数说明:

 setname:集合名称,可以是任何符合Python命名规则的标识符。

 elemnet 1,elemnet 2,…,elemnet n:集合中的元素。个数没有限制,只要是Python支持的数据类型就可以。

注意

创建集合时,使用的也是大括号“{}”。如果输入了重复的元素,Python会自动只保留一个。

例如,下面的代码将创建3个集合并打印输出。

01  set1 = {'水瓶座','射手座','双鱼座','双子座'}
02  set2 = {3,1,4,1,5,9,2,6}
03  set3 = {'Python', 28, ('人生苦短', '我用Python')}
04  print(set1)
05  print(set2)
06  print(set3)

执行结果如下:

{'水瓶座', '双子座', '双鱼座', '射手座'}
{1, 2, 3, 4, 5, 6, 9}
{'Python', ('人生苦短', '我用Python'), 28}

说明

Python中的set集合是无序的,每次输出时元素的排列顺序可能都有所不同,不必在意。

2.使用set()函数创建集合

也可以使用set()函数将列表、元组等其他可迭代对象转换为集合。set()函数的语法格式如下:

setname = set(iteration)

参数说明:

 setname:集合名称。

 iteration:表示要转换为集合的可迭代对象,可以是列表、元组、range对象等。另外,也可以是字符串,如果是字符串,返回的集合将是包含全部不重复字符的集合。

例如,下面的代码将创建3个集合并打印输出。

01  set1 = set("命运给予我们的不是失望之酒,而是机会之杯。")
02  set2 = set([1.414,1.732,3.14159,3.236])
03  set3 = set(('人生苦短', '我用Python'))
04  print(set1)
05  print(set2)
06  print(set3)

执行结果如下:

{'不', '的', '望', '是', '给', ',', '我', '。', '酒', '会', '杯', '运', '们', '予', '而', '失', '机', '命', '之'}
{1.414, 3.236, 3.14159, 1.732}
{'人生苦短', '我用Python'}

可见,在创建集合时如果出现重复元素,将只保留一个。这里,第一个集合中的“是”和“之”都只保留了一个。

注意

在Python中,创建集合时推荐采用set()函数。另外,创建空集合只能使用set()函数,而不能使用大括号“{}”。这是因为Python中直接使用一对大括号“{}”表示创建一个空字典。