Python 3.7从零开始学
上QQ阅读APP看书,第一时间看更新

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']

由输出结果看到,返回的列表中包含重复的元素。