Dict 字典是无序,可修改,它能存储任何数据,数据结构和json类似。
字典最大的特点,访问速度特别快,不管字典的数据量有多大,他们的访问速度都是一样。定义字典不管有10条数据和10万条数据,子要你内存足够他的访问数据都是一样。
一、字典定义
字典的每个值都具备自己独有的名称即键( key ),每个 key 都有对应的值( value ),字典中的 key 和 value 必须成对出现 。整个字典包括在花括号‘{ }’中,它的每个键值 ( key => value )对使用冒号( : )分割,每对值之间用逗号( , )分割。
定义如记录人员成绩的字典,如下:
d = {'Woodman': 95, 'Alan': 85, 'Bobo': 59}
我们把姓名 Woodman、Alan、Bobo 称为key,对应的成绩 95、85、59 称为value,dict 字典可以通过 key 来查找值,一个 key:value 算作一个值。
注意:dict字典用的键( key )必须是唯一的,但值则不必。一个字典中不能出现相同名称的键( key ),但值能相同,值可以是任何数据类型(字符串、数字、元组、列表、字典等)。
# 混合字典 key不重复,值可以是任意类型
d = {'woodman': 98, 2.5: 'PM', 'Bobo': [89, 65, 34],'Mydict': {'Alan': 99}}
拓展:dict 的最大特点是查找速度快,无论 dict 有10个元素还是10万个元素,查找速度都一样。
二、访问字典
1、获取 dict 字典的值
我们可以使用 dict [ key ] 来获取所需要的值。
d = {'woodman': 98, 9.86: 'GM', 'Bobo': [89, 65, 34], 'Mydict': {'Alan': 99}}
print(d['woodman'])
print(d[9.86])
print(d['AA']) # 会抛出KeyError异常,表示无此键(key)
通过 key 访问 dict 的 value,只要 key 存在,dict就返回对应的 value。如果key不存在,会直抛出 KeyError 异常。
怎么避免KeyError错误?
有两种方法:
第一种使用 key in dict 选判读字典中是否存在此key;
另一种是 dict 自带的 get方法 dict.get(key) ,在 key 不存在的时候,返回 None
d = {'woodman': 98, 9.86: 'GM', 'Bobo': [89, 65, 34], 'Mydict': {'Alan': 99}}
if 'woodman' in d: # d字典中有woodman
print(d['woodman'])
if 'Aric' in d: # 判断字典中是否有Aric键
print(d['Aric'])
print(d.get('Bobo')) # d字典中有Bobo,返回BoBo对应的值
print(d.get('my')) # d字典中无my,返回None
注意:dict 字典根据 key 存储值,他是无序的所以我们不能通过索引号访问数据( Python3.6 后字典为有序)
2、获取 dict 字典的所有的键 keys 和所有的值 values(获取的是key和values的迭代对象)
dict.keys() # 获取所有键 key 的可迭代对象
dict.values() # 获取字典所有的值 value 的可迭代对象
d = {'woodman': 98, 9.86: 'GM', 'Bobo': [89, 65, 34], 'Mydict': {'Alan': 99}}
print(d.keys()) # 获取字典所有的键的可迭代对象
print(d.values()) # 获取字典所有的值的可迭代对象
输出:
dict_keys(['woodman', 'Bobo', 'Mydict', 9.86])
dict_values([98, [89, 65, 34], {'Alan': 99}, 'GM'])
(楼下有杠精,加上一条说明)
注意:输出的是一个迭代对象的视图,如果要输出list,需要用list(d.key()) 进行强制转换。
三、新增与修改字典值
dict[key] = value 新增或修改字典值,当 key 不存在字典中时新增值,存在是则修改它的值
dict.update( otherdict ) 批量更新或增加值,根据o therdict 字典更新 dice 字典,otherdict 中有 dice 没有的值就新增,dice 中有的值就修改为 otherdict 中的值
d = {'woodman': 98, 9.86: 'GM', 'Bobo': [89, 65, 34], 'Mydict': {'Alan': 99}}
d['Bobo'] = 98 # 更新Bobo的值
print(d)
d['Aric'] = 66 # 字典中无Aric的值,添加Aric
print(d)
d1 = {'Aric': "I'm Ariv", 'woodman': "I'm woodman"}
d.update(d1) # 根据d1字典更新d字典,没有的值新增,有的值修改
print(d)
注意:我们 key 一旦定义我们不能修改 key
四、删除字典元素
dict.pop(key) # 删除对应键值
dict.clear() # 清空 dict
del dict[ key ] # 删除对应键值
del dict # 删除 dict,dict 无法访问
示例:
d = {'woodman': 98, 9.86: 'GM', 'Bobo': [89, 65, 34], 'Mydict': {'Alan': 99}}
d.pop(9.86) # 删除9.86 对应的值
print(d) # 输出结果 无9.86
del d['woodman'] # 删除单个键值
print(d) # 输出结果无woodman
d.clear() # 清空dict的键值,不会删除引用d
print(d) # d还能访问
del d # 删除字典d的引用
print(d) # 字典d无法访问,出现NameError异常
五、字典遍历
1、通过 key 遍历
d = {'woodman': 98, 9.86: 'GM', 'Bobo': [89, 65, 34], 'Mydict': {'Alan': 99}}
for key in d:
print(d[key])
输出:
GM
98
[89, 65, 34]
{'Alan': 99}
2、通过 dict.items 遍历
d = {'woodman': 98, 9.86: 'GM', 'Bobo': [89, 65, 34], 'Mydict': {'Alan': 99}}
for key, value in d.items():
print(key, ':', value)
输出:
9.86 : GM
Bobo : [89, 65, 34]
Mydict : {'Alan': 99}
woodman : 98
说明:dict.items() 是得到一个可迭代对象,视图如下,
dict_items([(9.86, 'GM'), ('woodman', 98), ('Mydict', {'Alan': 99}), ('Bobo', [89, 65, 34])])
六、字典常用函数
len( dict ) 计算字典元素个数,即键的总数
d = {'woodman': 98, 9.86: 'GM', 'Bobo': [89, 65, 34], 'Mydict': {'Alan': 99}}
print(len(d)) # 打印字典键的个数,4个
七、字典常用方法(看看就可以)
dict.clear() 删除字典内所有元素
dict.copy() 返回一个字典的浅复制
dict.fromkeys() 创建一个新字典,以序列seq中元素做字典的键,val为字典所有键对应的初始值
dict.get(key, default=None) 返回指定键的值,如果值不在字典中返回default值
dict.items() 以列表返回可遍历的(键, 值) 迭代对象
dict.keys() 以列表返回一个字典所有的键
dict.setdefault(key, default=None) 和get()类似, 但如果键不存在于字典中,将会添加键并将值设为default
dict.update(dict2) 把字典dict2的键/值对更新到dict里
dict.values() 以列表返回字典中的所有值
pop(key[,default]) 删除字典给定键 key 所对应的值,返回值为被删除的值。key值必须给出。否则,返回default值。
popitem() 随机返回并删除字典中的一对键和值。
八、总结
记住以下几点:
1、字典的键值对是无序的( Python3.6 开始有序),值可修改,定义字典时键值( key=>value )必须成对出现;
2、字典的键(key)不可以重复,键重复时值以最后一个为准;
3、字典的键必须不可变,所以可以用数字,字符串或元组充当,而不能用列表;
4、不管字典的数据量有多大,他们的访问速度都是一样的。