3.9 字典
3.9.1 字典的概念
【例3-14】 根据同学的名字查找对应的成绩。
采用列表实现,需要names和scores两个列表,并且列表中元素的次序一一对应,例如,zhou→95,Bob→75等,如下。
names =['zhou', 'Bob', 'Tracy'] scores =[95, 75, 85]
通过名字查找对应成绩,先在names中遍历找到所需查找的名字,再从scores中遍历取出对应的成绩,查找时间随着列表的长度增加。为了解决这个问题,Python提供了字典。
字典在其他程序设计语言中称为映射(map),通过键/值对(key/value)存储数据,键和值之间用冒号间隔,元素项之间用逗号间隔,整体用一对大括号括起来。字典语法结构如下。
dict_name={key:value,key:value}
字典具有如下特性。
(1)字典的值可以是任意数据类型,包括字符串、整数、对象,甚至字典。
(2)键/值对用冒号分隔,而元素项之间用逗号分隔,所有这些都包括在大括号中。
(3)键/值没有顺序。
(4)键必须是唯一的,不允许同一个键重复出现,如果同一个键被赋值两次,后一个值会覆盖前面的值。
>>>dict={'Name':'Zara', 'Age':7, 'Name': 'Zhou'} dict['Name']: Zhou
(5)键必须不可变,只能使用数字、字符串或元组充当,不能使用列表,如图3-11所示。
图3-11 键的取值
因为dict根据key来计算value的存储位置,如果每次计算相同的key得出的结果不同,那dict内部就完全混乱了。这个通过key计算位置的算法称为哈希(Hash)算法。为了保证Hash的正确性,作为key的对象就不能变。在Python中,字符串、整数等都是不可变的,而list是可变的,因此,list不能作为key。
字典与列表比较,具有以下几个特点。
(1)字典通过用空间来换取时间,其查找和插入的速度极快,不会随着“键”的增加而增加。
(2)字典需要占用大量的内存,内存浪费多。
(3)字典是无序的对象集合,字典当中的元素是通过键来存取的,而不是通过偏移存取。
采用字典实现例3-14,则只需创建“名字”/“成绩”的键值对,便可直接通过名字查找成绩。字典实现代码如下。