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中直接使用一对大括号“{}”表示创建一个空字典。