字典(dictionary)
字典 是无序的可变序列,保存的内容是以 “键(key)、值(value)” 对应的形式存放。键 是唯一的,值可以有多个。字典可以很方便的定义一个包含多个命名字段的对象。
字典的主要特征:
- 通过键而不是通过索引来读取;
- 字典是任意对象的无序集合;
- 字典是可变的,并且可以任意嵌套;
- 字典中的键必须是唯一的;
- 字典中的键必须不可变。
1.字典的创建和删除
-
创建字典时,键 和 值 之间使用冒号分隔,相邻的元素用逗号风分隔,所有元素放在一对 “{}” 中括号中。语法如下:
字典名 = {键1:值1,键2:值2,键3:值3,……,键n:值n} 字典名 = {} # 空字典
实例:
zidian = {'QQ':12345,'MSN':67890,'Wx':34567} print(zidian,type(zidian)) print('zidian 数据类型为:',type(zidian))
输出结果:
{'QQ': 12345, 'MSN': 67890, 'Wx': 34567} <class 'dict'> zidian 数据类型为: <class 'dict'>
-
通过映射函数创建字典
语法:
字典名 = dict(zip(列表1,列表2))
相关函数:
-
dict() 函数用于创建一个字典。
语法:
class dict(**kwarg) class dict(mapping, **kwarg) class dict(iterable, **kwarg)
参数说明:
- **kwargs – 关键字
- mapping – 元素的容器。
- iterable – 可迭代对象。
-
zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的对象,这样做的好处是节约了不少的内存。
语法:
zip([iterable, ...])
参数说明:
- iterabl – 一个或多个迭代器;
实例:
lie1 = ['QQ','MSN','Wx'] lie2 = [12345,67890,34567] zi = dict(zip(lie1,lie2)) print('得到的字典 zi:',zi) print('zi 的数据类型:',type(zi))
输出结果:
得到的字典 zi: {'QQ': 12345, 'MSN': 67890, 'Wx': 34567} zi 的数据类型: <class 'dict'>
-
-
通过给定的 “键 - 值” 创建字典
语法:
字典名 = dict(键1=值1,键2=值2,键3=值3,……,键n=值n)
实例:
zi = dict(QQ=12345,MSN=67890,Wx=34567) print(zi)
输出结果:
{'QQ': 12345, 'MSN': 67890, 'Wx': 34567}
-
使用 dict 对象的 fromkeys() 方法创建值为空的字典
语法:
字典名 = dict.fromkeys(列表)
实例:
lie = ['QQ','MSN','Wx'] zi = dict.fromkeys(lie) print ('值为空的字典:',zi)
输出结果:
值为空的字典: {'QQ': None, 'MSN': None, 'Wx': None}
函数说明:
fromkeys() 函数用于创建一个新字典,以序列 seq 中元素做字典的键,value 为字典所有键对应的初始值。
语法:
dict.fromkeys(seq[, value])
参数
- seq – 字典键值列表。
- value – 可选参数, 设置键序列(seq)的值。
-
通过已创建的元组和列表创建字典
lie1 = ('QQ','MSN','Wx') lie2 = [12345,67890,34567] zi = {lie1:lie2} print ('通过已创建的元组和列表创建的字典:',zi)
输出结果:
通过已创建的元组和列表创建的字典: {('QQ', 'MSN', 'Wx'): [12345, 67890, 34567]}
注意:通过已创建的元组和列表创建字典时,键必须时元组,列表无法作为键使用。
-
删除字典
lie1 = ('QQ','MSN','Wx') lie2 = [12345,67890,34567] zi = {lie1:lie2} print ('通过已创建的元组和列表创建的字典:',zi) zi.clear() print ('clear() 清空的字典:',zi) del zi print ('del 清空的字典:',zi)
输出结果:
通过已创建的元组和列表创建的字典: {('QQ', 'MSN', 'Wx'): [12345, 67890, 34567]} clear()清空的字典: {} Traceback (most recent call last): File "****.py", line 27, in <module> print ('del 清空的字典:',zi) NameError: name 'zi' is not defined
函数说明:
clear() 函数用于删除字典内所有元素。
语法:
字典名.clear()
pop() 方法
pop() 方法删除字典给定键 key 及对应的值,返回值为被删除的值。key 值必须给出。 否则,返回 default 值。
语法:
pop(key[,default])
参数:
- key: 要删除的键值
- default: 如果没有 key,返回 default 值
实例:
zi = {'QQ':12345,'MSN':67890,'Wx':34567} print ('显示字典:',zi) qq = zi.pop('QQ') print (qq) print ('显示字典:',zi)
输出结果:
显示字典: {'QQ': 12345, 'MSN': 67890, 'Wx': 34567} 12345 显示字典: {'MSN': 67890, 'Wx': 34567}
popitem() 方法
popitem() 方法随机返回并删除字典中的最后一对键和值,如果字典已经为空,却调用了此方法,就报出KeyError异常。
语法:
popitem()
实例:
zi = {'QQ':12345,'MSN':67890,'Wx':34567} print ('显示字典:',zi) zi.popitem() print ('再次显示字典:',zi)
输出结果:
显示字典: {'QQ': 12345, 'MSN': 67890, 'Wx': 34567} 再次显示字典: {'QQ': 12345, 'MSN': 67890}
2.通过 键 - 值对 访问字典
-
访问字典可以通过下标 键 的值实现,或者使用 get() 方法,注意字典和元组、列表的不同,通过索引是无法访问字典的。
实例:
zi = {'QQ':12345,'MSN':67890,'Wx':34567} print ('显示字典:',zi) print('字典内QQ号为:',zi['QQ']) # 通过下标 [key]访问字典元素 print('字典内MSN号为:',zi.get('MSN')) # 通过 get() 方法访问字典元素 print('字典内MSN号为:',zi.get('Wx','就不告诉你')) # 通过 get() 方法访问字典元素 print('字典内YY号为:',zi.get('YY')) print('字典内YY号为:',zi.get('YY','你来猜啊')) print('字典中的YY号:',zi['YY'] if 'YY' in zi else '没有录入此内容') # 通过 if 语句判断字典中是否存在查询键值
输出结果:
显示字典: {'QQ': 12345, 'MSN': 67890, 'Wx': 34567} 字典内QQ号为: 12345 字典内MSN号为: 67890 字典内MSN号为: 34567 字典内YY号为: None 字典内YY号为: 你来猜啊 字典中的YY号: 没有录入此内容
函数说明:
get() 函数返回指定键的值。
语法
get()方法语法:
dict.get(key, default=None)
参数
- key – 字典中要查找的键。
- default – 如果指定键的值不存在时,返回该默认值。
3.遍历字典
-
遍历字典是通过字典的 items() 方法实现
items() 方法以列表返回视图对象,是一个可遍历的key/value 对。
dict.keys()、dict.values() 和 dict.items() 返回的都是视图对象( view objects),提供了字典实体的动态视图,这就意味着字典改变,视图也会跟着变化。
视图对象不是列表,不支持索引,可以使用 list() 来转换为列表。
我们不能对视图对象进行任何的修改,因为字典的视图对象都是只读的。
语法:
dict.items()
实例:
zi = {'QQ':12345,'MSN':67890,'Wx':34567} print("获得字典中每一个键 - 值的元组列表:") for i in zi.items(): print(i) print("获得字典中具体的每一个键和值:") for k,v in zi.items(): print('key = ',k,',','values = ',v)
输出结果:
D:\Python39\python.exe "E:/BaiduNetdiskWorkspace/Python の/练习簿/字典练习.py" 获得字典中每一个键 - 值的元组列表: ('QQ', 12345) ('MSN', 67890) ('Wx', 34567) 获得字典中具体的每一个键和值: key = QQ , values = 12345 key = MSN , values = 67890 key = Wx , values = 34567
4.添加、修改和删除字典元素
实例说明一切:
zi = {'QQ':12345,'MSN':67890,'Wx':34567}
print ('显示字典:',zi)
zi['YY'] = 10100 # 向字典中添加 'YY':10100
print ('示修改后的字典1:',zi)
zi['QQ'] = 54321 # 将 'QQ' 的值改为:54321
print ('再显示修改后的字典2:',zi)
del zi['QQ'] # 直接删除 键 - 值 'QQ':54321
print ('显示修改后的字典3:',zi)
if 'YY' in zi: # 如何字典中存在 'YY' 就删除 'MSN'
del zi['MSN']
print ('显示修改后的字典4:',zi)
if 'MSN' in zi: # 如何字典中存在 'MSN' 就删除 'YY'
del zi['YY']
print ('显示修改后的字典5:',zi)
输出结果:
显示字典: {'QQ': 12345, 'MSN': 67890, 'Wx': 34567}
示修改后的字典1: {'QQ': 12345, 'MSN': 67890, 'Wx': 34567, 'YY': 10100}
再显示修改后的字典2: {'QQ': 54321, 'MSN': 67890, 'Wx': 34567, 'YY': 10100}
显示修改后的字典3: {'MSN': 67890, 'Wx': 34567, 'YY': 10100}
显示修改后的字典4: {'Wx': 34567, 'YY': 10100}
显示修改后的字典5: {'Wx': 34567, 'YY': 10100}
5.字典推导式
书上的实例:
import random # 导入生成随机数模块 random
zi = {i:random.randint(0, 100) for i in range(1, 5)}
print('生成 100 以内的 4 个随机数字典:',zi)
输出结果:
生成 100 以内的 4 个随机数字典: {1: 7, 2: 77, 3: 18, 4: 73}
列表、元组、字典 的推导式集合观察,可以看到三种推导式差异不大:
列表推导式:
import random # 导入生成随机数模块 random
liebiao1 = [random.randint(10,100) for i in range(5)] # 创建列表,并规定生成元素条件,和选择语句的条件表达式有些相似
print ("随机数列:",liebiao1)
输出结果:
随机数列: [77, 42, 53, 57, 23] # 随机数列每次执行结果各不相同
元组推导式:
import random # 导入生成随机数模块 random
yuan = (random.randint(10,100) for i in range(5)) # 按条件创建元组
print ("随机数列:",tuple(yuan)) #转换生成器对象为元组
print ("随机数元组:",yuan)
输出结果:
随机数列: (16, 31, 27, 14, 32)
最后总结一下,列表、元组、字典的区别:
数据结构 | 是否可变 | 是否有序 | 定义符号 | 字典 key |
---|---|---|---|---|
列表 | 可变 | 有序 | [ ] | 不可以 |
元组 | 不可变 | 有序 | ( ) | 可用 |
字典 | 可变 | 无序 | {key:value} | - |
2021年8月8日 更新