字典 dictionary
字典 ( dictionary )跟串列类似,都能作为储存数据的容器,可以放入字串、整数、布尔、串列或字典,顾名思义就像“查询用的字典”一样,透过要查询的“键 key”( 关键字 ),就能够查询到对应的“值 value”( 解释说明 ),也是使用频率相当高的数据型态。
本篇使用的 Python 版本为 3.7.12,所有范例可使用 Google Colab 实作,不用安装任何软件 ( 参考:使用 Google Colab )
建立字典
建立字典有两种方法,建立时必须要包含“键 key”和“值 value”两个项目,键在左侧,值在右侧。
字典和串列的差别在于串列有“顺序性”,串列中的项目都有各自的索引值 offset,但字典中的项目没有顺序性,是按照键 key 的位置来做纪录。
大括号 {}
使用大括号建立字典是最常见的建立字典方式,使用方式为“
{'鍵':值}”,键必须是“字串”,前后必须加上“引号”,值则可以是任意的 Python 对象 ( 字串、数字、串列、字典...等 ),不同键值中间使用逗号“,”分隔。下方的程序码,第一个键为 name 值为字串 oxxo,第二个键为 age 值为数字 18,第三个键为 eat 值为串列,最后印出 a 的 type 型别是 dict 字典。
a = {'name':'oxxo','age':18,'eat':['apple','banana']} print(type(a)); # <class 'dict'>单纯只要使用大括号,可以建立一个空的字典。
a = {} print(type(a)); # <class 'dict'>dict()
使用 dict() 建立字典使用“
dict(鍵=值)”,注意键的前后“不需要加上引号”。a = dict(name='oxxo', age=18, eat=['apple','banana']) print(a) # {'name': 'oxxo', 'age': 18, 'eat': ['apple', 'banana']} print(type(a)); # <class 'dict'>dict() 函数除了可以建立字典,也可以将有“两个值的二维串列或 tuple”转换成字典,转换时会将第一个值当作键,第二个当成值。
a = [['x','100'],['y','200'],['z','300']] b = dict(a) print(b) # {'x': '100', 'y': '200', 'z': '300'}如果是“双字元”的字串串列或 tuple,也可以使用 dict() 转换成字典。
a = ['ab','cd','ef'] b = dict(a) print(b) # {'a': 'b', 'c': 'd', 'e': 'f'}
读取字典
读取字典的项目时,有别于串列或 tuple 使用索引值 offset,只要知道字典的键,就能读取对应的值。
中括号 []
使用“
字典['鍵']”的方式,就能读取对应的值,如果读取到的是串列或 tuple,就可以使用读取串列或 tuple 的方式取出对应的项目,例如下方程序的变数 c,先取出串列,接着再取出串列的第一个项目。a = {'name':'oxxo', 'age':18, 'eat':['apple','banana']} b = a['name'] c = a['eat'][0] print(b) # oxxo print(c) # appleget()
使用中括号取值时,如果没有对应的键,就会发生错误,如果要避免这种情况,就可以使用 get() 函数来取值,使用方法为“
get('鍵')”,如果有键就会回传值,如果找不到键,就会回传 None。a = {'name':'oxxo', 'age':18, 'eat':['apple','banana']} b = a.get('name') c = a.get('school') print(b) # oxxo print(c) # None
修改字典
字典内的所有元素都是可以修改的,修改的方法有两种:
中括号 []
透过“
字典['鍵']=新值”的方式,就能够将字典中某个键对应的值,修改为新的值,下方程序码将 name 换成 XXXX,age 换成 100。a = {'name':'oxxo', 'age':18} a['name'] = 'XXXX' a['age'] = 100 print(a) # {'name': 'XXXX', 'age': 100}如果修改字典时,键不存在于字典中,会直接加入一个新的键和值,例如下方程序码,原本的字典中没有 ok 这个键,所以执行后就会将键为 ok 值为 True 的项目加入字典中。
a = {'name':'oxxo', 'age':18} a['name'] = 'XXXX' a['age'] = 100 a['ok'] = True print(a) # {'name': 'XXXX', 'age': 100, 'ok': True}setdefault()
setdefault() 函数用法和 get() 类似,都是可以取出某个键的值,但如果字典中没有对应的键,执行 setdefault() 就会将新的键和值加入字典中,使用的方式为“
setdefault('鍵',值)”,第二个值只针对“新的键”才有作用,下方的程序码,变数 b 取得的值仍然是 18 ( 因为 a 原本的 age 就是 18 ),但 c 取到 True 之后,字典 a 里就会加入 ok 为 True 的项目。a = {'name':'oxxo', 'age':18} b = a.setdefault('age', 100) c = a.setdefault('ok', True) print(a) # {'name': 'oxxo', 'age': 18, 'ok': True} print(b) # 18 print(c) # True
删除字典
删除字典有三种做法,包含了删除个别的键值,清空个字典或将整个字典移除:
del
使用“
del 字典['鍵']”可以删除字典中个别的键值,如果使用“del 字典”,则会将整个字典删除 ( 从内存中消失 ),下方程序码可以看出,删除了键为 name 的字典 a,只剩下 age 一个键,不过如果删除了整个字典 b,读取 b 时就会发生错误。a = {'name':'oxxo', 'age':18} del a['name'] print(a) # {'age': 18} b = {'name':'oxxo', 'age':18} del b print(b) # name 'b' is not definedpop()
使用“
pop('鍵')”可以将字典中某个键“取得并移出”,如果没有赋值给任何变数,这个键值就会删除,下方程序码会将 name 从字典 a 中取出并移除,并将 name 赋值给 b ( 注意,有别于串列的 pop() 可为空,字典的 pop('键') 操作一定要有键,不然会发生错误 )。a = {'name':'oxxo', 'age':18} b = a.pop('name') print(a) # {'age': 18} print(b) # oxxoclear()
使用“
字典.clear()”可以将字典中所有项目删除,变成一个空的字典。a = {'name':'oxxo', 'age':18} a.clear() print(a) # {}
结合字典
如果要将多个字典结合成一个字典,Python 提供两种方法:
两个星号**
使用两个星号“
**字典”,会将字典拆解为 keyword arguments 列表,再透过大括号组合,就可以将不同的字典结合为新的字典,下面的程序码,a、b、c 就会结合成 d。a = {'name':'oxxo', 'age':18} b = {'weight':60, 'height':170} c = {'ok':True} d = {**a, **b, **c} print(d) # {'name': 'oxxo', 'age': 18, 'weight': 60, 'height': 170, 'ok': True}update()
使用“
字典1.update(字典2)”,会将字典 2 的内容与字典 1 结合,下面的程序码,会将 b 和 c 依序和 a 结合。a = {'name':'oxxo', 'age':18} b = {'weight':60, 'height':170} c = {'ok':True} a.update(b) a.update(c) print(a) # {'name': 'oxxo', 'age': 18, 'weight': 60, 'height': 170, 'ok': True}
取得所有键和值
字典由键和值组成,透过“字典.keys()”能够将所有的键取出变成“dict_keys()”,透过“字典.values()”能够将所有的值取出变成“dict_values()”,两者都可以透过串列或 tuple 的方法,转换成串列或 tuple。
a = {'name':'oxxo', 'age':18, 'weight':60, 'height':170}
b = a.keys()
c = a.values()
print(b) # dict_keys(['name', 'age', 'weight', 'height'])
print(c) # dict_values(['oxxo', 18, 60, 170])
print(list(b)) # ['name', 'age', 'weight', 'height']
print(list(c)) # ['oxxo', 18, 60, 170]
使用 in 检查键
in 可以判断某个键是否存在于字典中,使用方法为“鍵 in 字典”,如果字典中存在这个键,就会回传 True,如果不存在,就回传 Fasle。
a = {'apple':10, 'banana':20, 'orange':30}
print('apple' in a) # True
print('grap' in a) # False
复制字典
Python 提供两种复制字典的方法:
copy()
copy() 可以快速复制一个新的字典,使用方式为“
字典.copy()”。a = {'x':10, 'y':20, 'z':30} b = a.copy() print(b) # {'x': 10, 'y': 20, 'z': 30}deepcopy()
copy() 的方法只能针对“项目内容不会发生变化”的字典,如果字典的“深层内容”会发生变化,就会出现奇怪的现象,举例来说,下方的程序码执行后,当 a 改变时理应不该影响到 b,但执行结果却发现 b 的内容也跟着改变了。
a = {'x':10, 'y':20, 'z':[100,200,300]} b = a.copy() a['z'][0] = 999 print(a) # {'x': 10, 'y': 20, 'z': [999, 200, 300]} print(b) # {'x': 10, 'y': 20, 'z': [999, 200, 300]}如果要解决这个问题,就必须要 import copy() 模组,使用 deepcopy() 进行深度复制,就能产生一个完全独立的新串列。
import copy a = {'x':10, 'y':20, 'z':[100,200,300]} b = copy.deepcopy(a) a['z'][0] = 999 print(a) # {'x': 10, 'y': 20, 'z': [999, 200, 300]} print(b) # {'x': 10, 'y': 20, 'z': [100, 200, 300]} 使用 deepcopy 的沒有被改變
微信扫码关注
抖音扫码关注