5.3 字典方法
像其他内建类型一样,字典也有方法,这些方法非常有用,不过可能不像使用列表或字符串一样频繁使用。学习本节时可以先简单了解一下有哪些方法可以使用,然后在需要时回过头来查看特定方法的具体用法。
5.3.1 clear()方法
clear()方法用于删除字典内的所有项。
clear()方法的语法如下:
dict.clear()
此语法中,dict代表指定字典,该方法不需要参数。该函数是一个原地操作(类似于list.sort)函数,没有任何返回值(返回值为None)。
该方法使用示例如下:
>>> student={'小萌': '1001', '小智': '1002', '小强': '1005','小张': '1006'} >>> print('字典元素个数为:%d个' % len(student)) 字典元素个数为:4个 >>> student.clear() >>> print('字典删除后元素个数为:%d个' % len(student)) 字典删除后元素个数为:0个
由输出结果可知,字典调用clear方法后整个字典内所有项都被删除。
下面看两个示例。
示例1:
>>> x={} >>> y=x >>> x['key']='value' >>> y {'key': 'value'} >>> x={} >>> y {'key': 'value'}
示例2:
>>> x={} >>> y=x >>> x['key']='value' >>> y {'key': 'value'} >>> x.clear() >>> y {}
两个示例中,x和y最初对应同一个字典。示例1中,通过将x关联到一个新的空字典对它重新赋值,这对y没有任何影响,还关联到原先的字典。若想清空原始字典中所有元素,则必须使用clear方法,使用clear后,y的值也被清空了。
5.3.2 copy()方法
copy()方法返回一个具有相同键/值对的新字典。这个方法是浅复制(shallow copy),因为值本身是相同的,而不是副本。
copy()方法的语法如下:
dict.copy()
此语法中,dict代表指定字典,该方法不需要参数。返回结果为一个字典的浅复制。
该方法使用示例如下:
>>> student={'小萌': '1001', '小智': '1002', '小强': '1005','小张': '1006'} >>> st=student.copy() >>> print('复制后得到的st为:',st) 复制后得到的st为: {'小强': '1005', '小萌': '1001', '小智': '1002', '小张': '1006'}
由输出结果看到,使用copy方法可以将字典复制给另一个变量。
我们可以通过下面的示例了解什么是浅复制。
>>> student={'小智': '1002', 'info':['小张','1006','man']} >>> st=student.copy() >>> st['小智']='1005' >>> print('更改copy后的st为:',st) 更改copy后的st为: {'info': ['小张', '1006', 'man'], '小智': '1005'} >>> print('原字符串为::',student) 原字符串为:: {'info': ['小张', '1006', 'man'], '小智': '1002'} >>> st['info'].remove('man') >>> print('删除后st为:',st) 删除后st为: {'info': ['小张', '1006'], '小智': '1005'} >>> print('删除后student为:',student) 删除后student为: {'info': ['小张', '1006'], '小智': '1002'}
由输出结果看到,替换副本的值时原始字典不受影响。如果修改了某个值(原地修改,不是替换),原始字典就会改变,因为同样的值也在原字典中。以这种方式进行复制就是浅复制,而使用深复制(deep copy)可以避免该问题,此处不做讲解,有兴趣的读者可以自己查找相关资料。
5.3.3 fromkeys()方法
fromkeys()方法用于创建一个新字典。
fromkeys()方法的语法如下:
dict.fromkeys(seq[, value]))
此语法中,dict代表指定字典;seq代表字典键值列表;value代表可选参数,设置键序列(seq)的值。该方法返回结果为列表。
该方法使用示例如下:
>>> seq = ('name', 'age', 'sex') >>> info = dict.fromkeys(seq) >>> print ("新的字典为 : %s" % info) 新的字典为 : {'name': None, 'sex': None, 'age': None} >>> info = dict.fromkeys(seq, 10) >>> print ("新的字典为 : %s" % info) 新的字典为 : {'name': 10, 'sex': 10, 'age': 10}
由输出结果看出,fromkeys方法使用给定的键建立新字典,每个键默认对应的值为None。
5.3.4 get()方法
get()方法返回指定键的值,如果值不在字典中,就返回默认值。
get()方法的语法如下:
dict.get(key, default=None)
此语法中,dict代表指定字典,key代表字典中要查找的键,default代表指定键的值不存在时返回默认值。该方法返回结果为指定键的值,如果值不在字典中,就返回默认值None。
该方法使用示例如下:
>>> student={'小萌': '1001', '小智': '1002'} >>> print ('小萌的学号为: %s' % student.get('小萌')) 小萌的学号为: 1001
由输出结果看到,get方法使用起来比较简单。再看如下示例:
>>> st={} >>> print(st['name']) Traceback (most recent call last): File "<stdin>", line 1, in <module> KeyError: 'name' >>> print(st.get('name')) None >>> print('name的值为:%s' % st.get('name')) name的值为:None
由输出结果看到,以其他方法试图访问字典中不存在的项时会出错,而使用get方法就不会。使用get方法访问一个不存在的键时,返回None。这里可以自定义默认值,用于替换None,例如:
>>> st={} >>> print('name的值为:%s' % st.get('name','未指定')) name的值为:未指定
由输出结果看到,输出结果中用“未指定”替代了None。
5.3.5 key in dict方法
Python字典in操作符用于判断键是否存在于字典中,如果键在字典dict中就返回true,否则返回false。
该方法的语法如下:
key in dict
此语法中,dict代表指定字典,key代表要在字典中查找的键。如果键在字典里就返回true,否则返回false。
该方法使用示例如下:
>>> student={'小萌': '1001', '小智': '1002'} >>> print('小萌在student字典中:%s'%('小萌' in student)) 小萌在student字典中:True >>> print('小强在student字典中:%s'%('小强' in student)) 小强在student字典中:False
由输出结果看到,已返回对应的True或False。
该方法是Python 3中的方法。在Python 2中有一个有相同功能的方法——has_key方法,has_key方法的使用方式和in不同。
5.3.6 items()方法
items()方法以列表返回可遍历的(键/值)元组数组。
items()方法的语法如下:
dict.items()
此语法中,dict代表指定字典,该方法不需要参数。返回结果为可遍历的(键/值)元组数组。
该方法使用示例如下:
>>> student={'小萌': '1001', '小智': '1002'} >>> print('调用items方法的结果:%s'% student.items()) 调用items方法的结果:dict_items([('小萌', '1001'), ('小智', '1002')])
由输出结果看到,返回结果为一个元组数组。
在Python 2中提供了一个iteritems方法,该方法和items方法的作用大致相同,但是iteritems方法返回的是一个迭代器对象,而不是列表。在Python 3中没有iteritems方法。
5.3.7 keys()方法
keys()方法以列表返回一个字典的所有键。
keys()方法的语法如下:
dict.keys()
此语法中,dict代表指定字典,该方法不需要参数。返回结果为一个字典的所有键。
该方法使用示例如下:
>>> student={'小萌': '1001', '小智': '1002'} >>> print('字典student所有键为:%s'% student.keys()) 字典student所有键为:dict_keys(['小萌', '小智'])
由输出结果看到,返回的是一个元组数组,数组中包含字典的所有键。
5.3.8 setdefault()方法
setdefault()方法和get()方法类似,用于获得与给定键相关联的值。如果键不存在于字典中,就会添加键并将值设为默认值。
setdefault()方法的语法如下:
dict.setdefault(key, default=None)
此语法中,dict代表指定字典,key代表查找的键值,default代表键不存在时设置的默认键值。该方法没有任何返回值。
该方法使用示例如下:
>>> student={'小萌': '1001', '小智': '1002'} >>> print('小强的键值为:%s'% student.setdefault('小强')) 小强的键值为:None >>> print('小智的键值为:%s'% student.setdefault('小智')) 小智的键值为:1002 >>> print('student字典新值为:%s'% student) student字典新值为:{'小强': None, '小萌': '1001', '小智': '1002'}
由输出结果看到,当键不存在时,setdefault方法返回默认值并更新字典;如果键存在,就返回与其对应的值,不改变字典。和get一样,默认值可以选择,如果不设定就使用None,如果设定就使用设定的值,例如:
>>> student={'小萌': '1001', '小智': '1002'} >>> print('小强的键值为:%s'% student.setdefault('小强')) 小强的键值为:None >>> print('小zhang的键值为:%s'% student.setdefault('小zhang','1006')) 小zhang的键值为:1006
由输出结果看到,小强没有设置值,使用的是默认值,输出键值为None;小zhang设置的默认值是1006,输出键值为1006。
5.3.9 update()方法
update()方法用于把字典dict2的键/值对更新到dict里。
update()方法的语法如下:
dict.update(dict2)
此语法中,dict代表指定字典,dict2代表添加到指定字典dict里的字典。该方法没有任何返回值。
该方法使用示例如下:
>>> student={'小萌': '1001', '小智': '1002'} >>> student2={'小李':'1003'} >>> print('原student字典为:%s'% student) 原student字典为:{'小萌': '1001', '小智': '1002'} >>> student.update(student2) >>> print('新student字典为:%s'% student) 新student字典为:{'小李': '1003', '小萌': '1001', '小智': '1002'} >>> student3={'小李':'1005'} >>> student.update(student3) #对相同项覆盖 >>> print('新student字典为:%s'% student) 新student字典为:{'小李': '1005', '小萌': '1001', '小智': '1002'}
由输出结果看到,提供的字典中的项被添加到旧字典中,如果有相同的键就会覆盖。
5.3.10 values()方法
values()方法以列表形式返回字典中的所有值。与返回键的列表不同,返回的列表中可以包含重复的元素。
values()方法的语法如下:
dict.values()
此语法中,dict代表指定字典,该方法不需要参数。返回结果为字典中的所有值。
该方法使用示例如下:
>>> student={'小萌': '1001', '小智': '1002','小李':'1001'} >>> print('student字典所有值为:%s'% list(student.values())) student字典所有值为:['1001', '1001', '1002']
由输出结果看到,返回的列表中包含重复的元素。