好好学Python:从零基础到项目实战
上QQ阅读APP看书,第一时间看更新

5.3 字典方法

像list列表、str字符串等内建类型一样,字典也有方法,本节将详细介绍字典中的一些基本方法。

5.3.1 get()方法

get()方法返回字典中指定键的值,get()方法的语法格式如下:

dict.get(key, default=None)

此语法中,dict代表指定字典,key代表字典中要查找的键,default代表指定的键不存在时返回的默认值。该方法返回结果为指定键的值,如果键不在字典中,就返回默认值None。

该方法的使用示例如下:

>>> student={'小萌': '000', '小智': '001'}
>>> print (f'小萌的学号为: {num})')
小萌的学号为: 000)

由输出结果可以看到,get()方法使用起来比较简单。再看如下示例:

由输出结果可以看到,用其他方法试图访问字典中不存在的项时会出错,而使用get()方法就不会报错。使用get()方法访问一个不存在的键时,返回None。这里可以自定义默认值,用于替换None,例如:

>>> st={}
>>> name=st.get('name','未指定')
>>> print(f'name的值为:{name}')
name的值为:未指定

由输出结果可以看到,输出结果中用“未指定”替代了None。

在实际项目应用中,get()方法使用非常多,在使用字典时,get()方法的使用几乎是不可避免的。

5.3.2 keys()方法

在Python中,keys()方法用于返回一个字典的所有键,keys()方法的语法格式如下:

dict.keys()

此语法中,dict代表指定字典,keys()方法不需要参数。返回结果为一个字典的所有键,所有键存放于一个元组数组中,元组数组中的值没有重复的。

该方法的使用示例如下:

    >>> student={'小萌': '000', '小智': '001'}
    >>> all_keys=student.keys()
    >>> print(f'字典student所有键为:{all_keys}')
    字典student所有键为:dict_keys(['小萌', '小智'])
    >>> print(f'字典student所有键为:{list(all_keys)}')  #keys()得到元组数组,转成list,
便于观看
    字典student所有键为:['小萌', '小智']

由输出结果可以看到,keys()方法返回的是一个元组数组,数组中包含字典的所有键。

在实际项目应用中,keys()方法的使用也非常多,经常会遇到需要将字典中的键转化为列表做操作的应用。

5.3.3 values()方法

values()方法用于返回字典中的所有值。values()方法的语法格式如下:

dict.values()

此语法中,dict代表指定字典,values()方法不需要参数。返回结果为字典中的所有值,所有值存放于一个列表中,与键的返回不同,值的返回结果中可以包含重复的元素。

该方法的使用示例如下:

    >>> student={'小萌': '000', '小智': '1002','小李':'002'}
    >>> all_values=student.values()
    >>> print(f'student字典所有值为:{all_values}')
    student字典所有值为:dict_values(['000', '1002', '002'])
    >>> print(f'student字典所有值为:{list(all_values)}') #values()得到元组数组,转成
list,便于观看
    student字典所有值为:['000', '1002', '002']

由输出结果可以看到,values()方法返回的是一个元组数组,数组中包含字典的所有值,返回的值中包含重复的元素值。

在实际项目应用中,values()方法的使用也非常多,经常会遇到需要将字典中的值转化为列表做操作的应用,并且一般会和keys()方法一起使用。

5.3.4 key in dict方法

在Python中,字典中的in操作符用于判断键是否存在于字典中。key in dict方法的语法格式如下:

key in dict

此语法中,dict代表指定字典,key代表要在字典中查找的键。如果键在字典中,就返回True,否则返回False。

该方法的使用示例如下:

>>> student={'小萌': '000', '小智': '001'}
>>> xm_in_stu='小萌' in student
>>> print(f'小萌在student字典中:{xm_in_stu}')
小萌在student字典中:True
>>> xq_in_stu='小强' in student
>>> print(f'小强在student字典中:{xq_in_stu}')
小强在student字典中:False

由输出结果可以看到,使用key in dict方法,返回结果为对应的True或False。

该方法是Python 3.x中才有的方法。在Python 3.x之前没有,在Python 2.x中有一个和该方法具有相同功能的方法—has_key()方法,不过has_key()方法的使用方式和in不同,有兴趣的读者可以去做深入了解,此处不展开讲解。

在实际项目应用中,key in dict方法应用也比较多,一般多用于判断某个键是否在字典中,以此来判定下一步的执行计划。

5.3.5 update()方法

update()方法用于把一个字典A的键值对更新到另一个字典B里。update()方法的语法格式如下:

dict.update(dict2)

此语法中,dict代表指定字典,dict2代表添加到指定字典dict里的字典。该方法没有任何返回值。

该方法的使用示例如下:

>>> student={'小萌': '000', '小智': '001'}
>>> student2={'小李':'003'}
>>> print(f'原student字典为:{student}')
原student字典为:{'小萌': '000', '小智': '001'}
>>> student.update(student2)
>>> print(f'新student字典为:{student}')
新student字典为:{'小萌': '000', '小智': '001', '小李': '003'}
>>> student3={'小李':'005'}
>>> student.update(student3)  #对相同项覆盖
>>> print(f'新student字典为:{student}')
新student字典为:{'小萌': '000', '小智': '001', '小李': '005'}

由输出结果可以看到,使用update()方法,可以将一个字典中的项添加到另一个字典中,如果有相同的键就会将键对应的值覆盖。

在实际项目应用中,update()方法的使用不是很多,一般用于将两个字典合并。

5.3.6 clear()方法

clear()方法用于删除字典内的所有元素。clear()方法的语法格式如下:

dict.clear()

此语法中,dict代表指定字典,该方法不需要参数。该函数是一个原地操作函数,没有任何返回值(返回值为None)。

该方法的使用示例如下:

>>> student={'小萌': '000', '小智': '001', '小强': '002','小张': '003'}
>>> print(f'字典元素个数为:{len(student)}')
字典元素个数为:4
>>> student.clear()
>>> print(f'字典删除后元素个数为:{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的值也被清空了。

在实际项目应用中,clear()方法的使用不是很多,一般在大批量遍历时,会使用clear()方法清空一个字典,便于下一次遍历使用。

5.3.7 copy()方法

copy()方法用于返回一个具有相同键值对的新字典,copy()方法的语法格式如下:

dict.copy()

此语法中,dict代表指定字典,该方法不需要参数。该方法的返回结果为一个字典的浅复制(shallow copy)。

该方法的使用示例如下:

>>> student={'小萌': '000', '小智': '001', '小强': '002','小张': '003'}
>>> st=student.copy()
>>> print(f'复制student后得到的st为:{st}')
复制student后得到的st为:{'小萌': '000', '小智': '001', '小强': '002', '小张': '003'}

由输出结果可以看到,使用copy()方法可以将一个字典变量复制给另一个变量。

接下来,通过下面的示例介绍什么是浅复制。

>>> student={'小智': '001', 'info':['小张','003','man']}
>>> st=student.copy()
>>> st['小智']='1005'
>>> print(f'更改copy后的st为:{st}')
更改copy后的st为:{'小智': '1005', 'info': ['小张', '003', 'man']}
>>> print(f'原字符串为:{student}')
原字符串为:{'小智': '001', 'info': ['小张', '003', 'man']}
>>> st['info'].remove('man')
>>> print(f'变量st中删除man后,st变为:{st}')
变量st中删除man后,st变为:{'小智': '1005', 'info': ['小张', '003']}
>>> print(f'删除后student为:{student}')
删除后student为:{'小智': '001', 'info': ['小张', '003']}

由输出结果可以看到,替换副本的值时原始字典不受影响。如果修改了某个值(原地修改,不是替换),原始字典就会改变,因为同样的值也在原字典中。以这种方式进行复制就是浅复制,而使用深复制(deep copy)可以避免该问题,此处不进行讲解,感兴趣的读者可以自己查找相关资料。

在实际项目应用中,copy()方法的使用不多。当然,在用到copy()可以实现的功能时,要毫不犹豫地使用copy()方法。

5.3.8 fromkeys()方法

fromkeys()方法用于创建一个新字典,fromkeys()方法的语法格式如下:

dict.fromkeys(seq[, value]))

此语法中,dict代表指定字典,seq代表字典键值列表,value代表可选参数,设置键序列(seq)的值。该方法的返回结果为列表。

该方法使用示例如下:

>>> seq=('name', 'age', 'sex')
>>> info=dict.fromkeys(seq)
>>> print (f'新的字典为:{info}')
新的字典为:{'name': None, 'age': None, 'sex': None}
>>> info=dict.fromkeys(seq, 10)
>>> print(f'新的字典为:{info}')
新的字典为:{'name': 10, 'age': 10, 'sex': 10}

由输出结果可以看到,fromkeys()方法使用给定的键建立新字典,每个键默认对应的值为None。

在实际项目应用中,fromkeys()方法的使用不多,更多地用于初始化一个新字典。

5.3.9 items()方法

items()方法以列表返回可遍历的(键/值)元组数组,items()方法的语法格式如下:

dict.items()

此语法中,dict代表指定字典,该方法不需要参数。返回结果为可遍历的(键/值)元组数组。

该方法的使用示例如下:

>>> student={'小萌': '000', '小智': '001'}
>>> print(f'调用items方法的结果:{student.items()}')
调用items方法的结果:dict_items([('小萌', '000'), ('小智', '001')])

由输出结果可以看到,items()方法的返回结果为一个元组数组。

在实际项目应用中,items()方法使用得不多。

5.3.10 setdefault()方法

setdefault()方法和get()方法类似,用于获得与给定键相关联的值,setdefault()方法的语法格式如下:

dict.setdefault(key, default=None)

此语法中,dict代表指定字典,key代表查找的键值,default代表键不存在时设置的默认键值。setdefault()方法返回key在字典中对应的值,如果键不存在于字典中,就会添加键并将值设为默认值,然后返回新设置的默认值。

该方法的使用示例如下:

>>> student={'小萌': '000', '小智': '001'}
>>> xq=student.setdefault('小强')
>>> print(f'小强的键值为:{xq_default}')
小强的键值为:None
>>> xz=student.setdefault('小智')
>>> print(f'小智的键值为:{xz}')
小智的键值为:001
>>> print(f'student字典新值为:{student}')
student字典新值为:{'小萌': '000', '小智': '001', '小强': None}

由输出结果可以看到,当键不存在时,setdefault()方法返回默认值并更新字典;当键存在时,就返回与其对应的值,不改变字典。和get()方法一样,默认值可以选择,如果不设定就为None,如果设定就为设定的值,示例如下:

>>> student={'小萌': '000', '小智': '001'}
>>> xq=student.setdefault('小强')
>>> print(f'小强的键值为:{xq}')
小强的键值为:None
>>> print(f'student为:{student}')
student为:{'小萌': '000', '小智': '001', '小强': None}
>>> xz=student.setdefault('小张','006')
>>> print(f'小张的键值为:{xz}')
小张的键值为:006
>>> print(f'student为:{student}')
student为:{'小萌': '000', '小智': '001', '小强': None, '小张': '006'}

由输出结果可以看到,小强没有设置值,使用的是默认值,输出键值为None;小张设置的默认值是006,输出键值为006。

在实际项目应用中,setdefault()方法的使用不多。