当前版本:
- Python 3.8.4
简介
字典是一种无序的、可变的、键值对的数据结构。通常用于存储键值对,其中键是唯一的,值可以是任何类型的对象。它可以快速查找和访问数据,关联相互有关的信息,灵活地添加、修改和删除数据,以及存储标签或选项。字典的高效性和哈希映射使得它在各种场景下都非常有用。
需要注意的是:字典中的键是无序的,所以无法通过索引来访问字典的元素。如果需要按特定顺序访问字典的元素,可以使用 sorted() 函数对键进行排序。
文章目录如下
1. 如何定义字典
python中的 "字典" 类似于我们平时在新华书店买的 "字典"。新华字典的作用是存储汉字、词语、成语等,我们一般通过目录去查找某个词语的详细解释。而python中的 "字典" 也是类似的用法,当需要对某些字段做解释时,那么利用字典来存储。比如 姓名:小李,年龄:18
D = {"name" : "小李", "age" : 18}
使用字典存储以后我们可以直接对某个字段取值(也就是对键取值)
什么是键、值呢?
在字典中,每个元素由2个值组成,前面的值称为 "键",后面的值称为 "值"
D = {"键1":"值1" , "键2":"值2"} # 使用冒号来分割键和值,组成的一个元素 # 每个元素之间的用逗号来分割
- 键(key)是数据的唯一标识符(不可变),用于唯一地标识字典中的每个元素。可以是字符串、数字或元组等数据类型。
- 值(value)是与键相关联的数据。每个键在字典中都对应一个值,可以存储任意类型的数据。可以是字符串、数字、列表、元组、字典或其他复杂的数据类型。
当键和值组合在一起后就成为了一组数据,我们把这组数据统称为 "键值对"。
定义标准的字典
在python中可以使用两种方法来定义一个字典({ } 或者 dict )
D = {} # 定义一个空字典
D = dict() # 定义一个空字典
当定义字典的内容较多时,我们一般采用换行的格式(便于阅读)
age = {
"张三" : 22,
"李四" : 18,
"王五" : 21,
"赵六" : 15
}
2. 字典的操作方法
- 这一章节主要介绍字典的各种增删改查。
2.1. 添加/更新元素
我们一般通过键来添加一个值
D = {}
D["name"] = "小李"
键是唯一的,如果向已存在的键添加值则会修改原来的值
除了单个添加键值对以外,也可以使用 update 批量添加
# 定义一个字典
D = {'A': 1, 'B': 2, 'C': 3}
# 批量添加键值对
D.update({'D': 4, 'E': 5})
如果键已存在则会被更新
键是唯一的,但值可以重复
D = {"小李":18 , "小张":18}
也能使用for循环批量添加
# 定义一个空字典
D = {}
# 循环0~4
for i in range(5):
# 将键设为A{i},值设为i除以2取余
D[f"A{i}"] = i % 2
还能将两个列表或元组组合成一个字典
# 定义2个列表
L1 = ["A", "B", "C"]
L2 = [1, 2, 3]
# 将这2个列表转换为zip,再转换为字典
D = dict(zip(L1, L2))
如果两个列表或元组的数量不一致,那么只取最短的数量来组成字典
由于键是唯一的,当作为键的列表中存在相同的元素时,那么只取一个值作为键;作为值的列表只取最后一个。
相当于这种情况(已经添加了A,然后更新A)
D = {}
D["A"] = 1 # 添加到字典
D["A"] = 2 # 由于键相同,所以更新
2.2. 删除元素
在删除元素的方法中,常用 del 、pop 、clear
- del:删除指定键的键值对
- pop:删除指定键的键值对,并返回对应的值
- clear:清空字典
【案例一】通过一个键来删除键值对
age = {
"张三" : 22,
"李四" : 18,
"王五" : 21,
"赵六" : 15
}
# 删除"李四"这个键值对
del age["李四"]
【案例二】通过一个键来删除键值对(返回被删除的值)
age = {
"张三" : 22,
"李四" : 18,
"王五" : 21,
"赵六" : 15
}
# 删除"李四"这个键值对
age.pop("李四")
【案例三】清空字典
age = {
"张三" : 22,
"李四" : 18,
"王五" : 21,
"赵六" : 15
}
# 清空这个字典
age.clear()
也可以利用重新赋值的方式来清空
【案例四】不删除键,只删除值
age = {
"张三" : 22,
"李四" : 18,
"王五" : 21,
"赵六" : 15
}
# 将"李四"修改为空
age["李四"] = None
2.3. 访问元素
字典可以单独访问某个值,也可以访问全部键或值。
【案例一】通过键名访问值
age = {
"张三" : 22,
"李四" : 18,
"王五" : 21,
"赵六" : 15
}
# 访问张三的值
age["张三"]
【案例二】如果该键不存在返回默认值
age = {
"张三" : 22,
"李四" : 18,
"王五" : 21,
"赵六" : 15
}
# 如果不存在张四,则返回100
age.get("张四", 100)
【案例三】访问全部键
age = {
"张三" : 22,
"李四" : 18,
"王五" : 21,
"赵六" : 15
}
# 访问全部键
age.keys()
【案例四】访问全部值
age = {
"张三" : 22,
"李四" : 18,
"王五" : 21,
"赵六" : 15
}
# 访问全部值
age.values()
【案例五】访问全部键和值
age = {
"张三" : 22,
"李四" : 18,
"王五" : 21,
"赵六" : 15
}
# 访问全部键和值
age.items()
2.4. 检查字典
在操作业务时为防止数据被修改,一般需要先判断某个键是否存在,如果不存在则添加数据
D = {"A":1, "B":2}
# 判断是否存在为A的键
"A" in D
同样可以使用 in 检查某个值是否存在
D = {"A":1, "B":2}
# 判断是否存在为1的值
1 in D.values()
使用 if + and 判断多个键是否存在
D = {"A":1, "B":2, "C":3}
if "A" in D and "B" in D:
print("A和B都存在")
检查该字典是否为空
D = {}
if len(D) == 0:
print("该字典为空")
3. 字典的实际应用
3.1. 配置文件
字典可以为应用程序提供轻松的配置文件格式。字典中的键可以是配置项名称,值则可以是该配置项的值。
例如设定一些数据库的配置
db_conf = {
"host": "localhost",
"port": 3306,
"database": "test",
"user" : "root",
"password" : "123456"
}
在调用这些配置时可以直接通过字典读取
3.2. 循环遍历字典
循环遍历也是字典最常用的方法之一,介绍几种实用的:
【案例一】遍历键
db_conf = {
"host": "localhost",
"port": 3306,
"database": "test",
"user" : "root",
"password" : "123456"
}
# 遍历所有的键
for key in db_conf:
print(f"当前的键为:{key}")
【案例二】遍历值 values()
db_conf = {
"host": "localhost",
"port": 3306,
"database": "test",
"user" : "root",
"password" : "123456"
}
# 遍历所有的值
for value in db_conf.values():
print(f"当前的值为:{value}")
【案例三】遍历所有的键和值 items()
db_conf = {
"host": "localhost",
"port": 3306,
"database": "test",
"user" : "root",
"password" : "123456"
}
# 遍历所有的值
for key,value in db_conf.items():
print(f"当前的键为:{key},当前的值为:{value}")
3.3. 模拟数据库
- 字典可以存储表的行数据,将键作为列名,值作为单元格的值。这对于小型应用很有帮助。
使用字典定义一张员工表
staff = {
# id号 姓名 年龄 工资
1: {'name': '张三', 'age': 25, 'salary': 8000},
2: {'name': '李四', 'age': 30, 'salary': 7000},
3: {'name': '王五', 'age': 35, 'salary': 15000},
}
添加一个员工信息
staff[4] = {'name': '赵六', 'age': 27, 'salary': 9000}
查询全部员工信息
for key,value in staff.items():
print(f"id: {key}, message: {value}")
查询薪资大于8000的员工信息
for key,value in staff.items():
if value['salary'] > 8000:
print(f"id: {key}, message: {value}")
查询id为3员工的薪资
print(staff[3]['salary'])
for key,value in staff.items():
if key == 3:
print(value['name'], ':', value['salary'])
3.4. 模拟缓存
使用字典来缓存函数计算结果,以允许后续的函数调用更快地执行。这对于需要重复计算的函数和大量数据时非常有用
# 创建一个空字典作为缓存
cache = {}
def power_operation(x):
'''封装一个幂运算的函数'''
# 检查结果是否已经在缓存中
if x in cache:
# 如果在缓存中,直接返回缓存中的结果
return cache[x]
# 如果结果不在缓存中,进行计算
result = x ** 2
# 将结果保存到缓存中
cache[x] = x ** 2
return result
# 调用函数
print(power_operation(3)) # 未缓存
print(power_operation(3)) # 已缓存
print(power_operation(6)) # 未缓存