2.7 字典
字典的概念来自英文Dictionary的翻译,意思是一对key-value的组合值,通常称为键-值对。本节将介绍Python中的字典。
2.7.1 使用字典
在Python中,使用{}定义字典,字典中的键-值对用冒号间隔,比如定义一个字典:
stu1={'学号':'10001','姓名':'张晓光','性别':'男','年龄':20}
在字典中,键是不可变的(数字、字符串、元组),但值是可以改变的,比如要改变上述字典中的年龄为30,可以这样写:
stu1['年龄']=30
注 意
字典中的值可以是任意类型,因为键是不可改变的,所以不能是列表等可变类型。
在字典中,键是唯一的,虽然定义字典时允许输入两个相同的键,但实际上后一个键的值会覆盖上一个键的值,比如以下代码定义了重复的“姓名”键:
stu1={'学号':'10001','姓名':'张晓光','姓名':'李三','年龄':20}
stu1['姓名']输出的结果会是‘李三’。
上面我们演示的键都是字符串,其实键还可以是数字或元组,比如下面定义一组数字键:
day={1:'星期一',2:'星期二',3:'星期三'}
print(day[1])
也可以使用混合类型的键,比如既有数字键又有字符串的键:
day={1:'星期一',2:'星期二',3:'星期三','四':'星期四'}
print(day['四'])
2.7.2 访问字典
访问序列中的元素基本都用[],字典也不例外。因为元素是键-值对,所以[]中还需要指定要访问的键。比如stu1['姓名']就是访问“姓名”键所对应的值。
注 意
访问列表或元组时,可以使用stu1[索引]的方式,但字典中并不可以,比如使用索引[0]并不会访问第1个元素,而是访问键为0的元素。
下面举例:
day={1:'星期一',2:'星期二',3:30,'四':'星期四'}
print(day['四']) #星期四 print(day[2]) #星期二
2.7.3 字典常用的内置函数
字典中包括一些返回值、返回键的方法,如表2.9所示。
表2.9 字典常用的内置函数
说 明
一旦定义一个变量,其在内存中占据的位置一般不可变,都是通过一个引用指向该变量。如果复制某个变量,也只是增加一个引用,具体位置还是不变,这个时候就是浅拷贝;如果增加引用的同时具体位置也发生了变化,这种称为深拷贝。
下面举例:
【示例2-26】
输出结果如图2-14所示。
图2.14 字典内置函数应用
这里要特别说明几点:
(1)如果是通过=赋值的方式创建一个新的字典,使用的就是浅拷贝,也就是说,并不开辟一块内存保存新字典。如果是通过copy函数创建一个新字典,就是深拷贝方式,通过id(dict)输出的内存地址信息可以判断。
(2)get和setdefault都可以获取指定键的值,但如果指定的键并不存在,get就返回默认值None,而setdefault就会将指定的键添加到字典中。
(3)update是将指定的字典更新到当前字典中,但如果指定的字典中并不包含值,也就是只有键的情况,如{'张三','上海'}这种形式,代码并不报错,而是自动分割键,给当前字典增加键值对,比如增加后是{'张':'三','上':'海'}这种形式。因此,在使用update时要检查仔细。
2.7.4 删除字典
删除字典的方法有很多种,如clear、pop、popitem、del等,这些有的只能删除字典元素,有的可以删除字典,具体说明如下:
• clear():清空字典中所有键-值对。
• pop(key):删除指定键的键-值对,有返回值,返回值为被删除的值。
• popitem():删除最后一项键-值对,有返回值,返回值为被删除的键-值对。
• del:删除字典元素或字典,如果删除的是字典,再访问字典时会报错。
(1)首先介绍clear,清空字典后,如果再访问字典,就不会报错,返回{}。
(2)pop函数在使用时有两个步骤:
• 一是在字典中删除键-值对。
• 二是返回被删除的值。
因为有返回值,所以可以定义一个变量接收该值,例如:
(3)popitem没有参数,默认是删除最后一项键-值对(返回元组),例如:
(4)如果del指定键,则删除的效果和popitem没有区别,但并不返回值;如果del不指定键,则会删除整个字典。
因为第2次用del删除了字典,所以访问时会报错,如图2.15所示。
图2.15 删除字典报错
2.7.5 字典常用运算符
字典没有+、*运算符,只有in运算符,用于判断指定的键是否在字典中,或者使用not in判断指定的键是否不在字典中。
下面举例:
【示例2-27】
上述代码使用if做了两次判断,第1次判断字典中是否有“姓名”键,如果有,就输出该键对应的值。第2次判断是否没有“性别”键,如果没有,就使用setdefault添加该键,并输出当前字典。代码输出结果是:
张晓光 {'姓名': '张晓光', '年龄': 20, '性别': '男'}