数据容器:dict(字典、映射)
- 为什么需要字典?
字典提供了 通过A,找到与A相关联的内容的功能
Q:为什么使用字典?
因为使用字典,可以实现通过Key,找到对应的Value的操作
字典的定义
字典:同样使用{},不过存储的元素是一个个的:键值对
语法:
# 定义字典字面量 {key: value, key: value, ....., key: value} # 定义字典变量 my_dict = {key: value, key: value, ....., key: value} # 定义空字典 my_dict = {} # 方式1 my_dict = dict() # 方式2
# 定义字典 my_dict1 = {"aa": 90, "bb": 83, "cc": 77} # 定义空字典 my_dict2 = {} my_dict3 = dict() print(f"字典1的内容是:{my_dict1},类型{type(my_dict1)}") print(f"字典2的内容是:{my_dict2},类型{type(my_dict2)}") print(f"字典3的内容是:{my_dict3},类型{type(my_dict3)}") # python字典中的Key是不可以重复的 运行效果: 字典1的内容是:{'aa': 90, 'bb': 83, 'cc': 77},类型<class 'dict'> 字典2的内容是:{},类型<class 'dict'> 字典3的内容是:{},类型<class 'dict'>
# 定义重复key的字典 my_dict1 = {"aa": 90, "aa": 83, "cc": 77} print(f"字典1的内容是:{my_dict1},类型{type(my_dict1)}") 运行效果: 字典1的内容是:{'aa': 83, 'cc': 77},类型<class 'dict'> # 新的会把老的给覆盖掉
字典数据的获取
字典同集合一样,不可以使用下标索引
但是字典可以通过Key值来取得对应的Value
# 从字典中基于Key获取Value my_dict1 = {"aa": 90, "bb": 83, "cc": 77} score = my_dict1["aa"] print(f"aa的考试分数是:{score}") score = my_dict1["bb"] print(f"bb的考试分数是:{score}") 运行效果: aa的考试分数是:90 bb的考试分数是:83
字典的嵌套
字典的Key和Value可以是任意数据类型(Key不可为字典)
这表明,字典是可以嵌套的
需求如下:记录学生各科的考试信息
# 定义嵌套字典 stu_score_dict = { "aa": { "语文": 77, "数学": 87, "英语": 90 }, "bb": { "语文": 80, "数学": 99, "英语": 50 }, "cc": { "语文": 97, "数学": 77, "英语": 80 } } print(f"学生的考试信息是:{stu_score_dict}") # 从嵌套字典中获取数据 # 看一下aa的语文信息 score = stu_score_dict["aa"]["语文"] print(f"aa的语文分数是:{score}") score = stu_score_dict["bb"]["英语"] print(f"bb的英语分数是:{score}")
字典的注意事项
- 键值对的Key和Value可以是任意类型(Key不可为字典)
- 字典内Key不允许重复,重复添加等同于覆盖原有数据
- 字典不可用下标索引,而是通过Key检索Value
字典的常用操作
(1)新增元素
语法:字典[Key] = Value
结果:字典被修改,新增了元素
新增元素、更新元素 语法一致
如果新增的key不存在,等同于新增元素
如果新增的key存在,等同于更新元素 【因为key不可重复,所以会覆盖原来的value值】
(2)更新元素
语法:字典[Key] = Value
结果:字典被修改,元素被更新
Tip:字典Key不可以重复,所以对已存在的Key执行上述操作,就是更新Value值
my_dict = {"aa": 89, "bb": 90, "cc": 77} # 新增元素 my_dict["dd"] = 99 print(f"字典新增元素之后是:{my_dict}") # 更新元素 my_dict["bb"] = 66 print(f"字典更新后:{my_dict}") 运行效果: 字典新增元素之后是:{'aa': 89, 'bb': 90, 'cc': 77, 'dd': 99} 字典更新后:{'aa': 89, 'bb': 66, 'cc': 77, 'dd': 99}
(3)删除元素
语法:字典.pop(Key)
结果:获得指定Key的Value,同时字典被修改,指定Key的数据被删除
# 删除元素 score = my_dict.pop("bb") print(f"字典中移除了一个元素,结果:{my_dict},bb的分数:{score}") 运行效果: 字典中移除了一个元素,结果:{'aa': 89, 'cc': 77, 'dd': 99},bb的分数:66
(4)清空字典
语法:字典.clear()
结果:字典被修改,元素被清空
# 清空元素 my_dict.clear() print(f"字典给被清空,内容是:{my_dict}") 运行效果: 字典给被清空,内容是:{}
(5)获取全部key
语法:字典.keys()
结果:得到字典中的全部Key
# 获取全部key my_dict = {"aa": 89, "bb": 90, "cc": 77} keys = my_dict.keys() print(f"字典的全部key:{keys}") 运行效果: 字典的全部key:dict_keys(['aa', 'bb', 'cc'])
- 取出key的用处
# 遍历字典 # 方式1:通过获取到全部的key来完成遍历 for key in keys: print(f"字典的key:{key}") print(f"字典的value:{my_dict[key]}") # 方式2:直接对字典进行for循环,每一次循环都是直接得到key for key in my_dict: print(f"字典的key:{key}") print(f"字典的value:{my_dict[key]}") # 因为字典不支持下标索引,所以字典不可以用while循环
因为字典不支持下标索引,所以字典不可以用while循环
(6)统计字典中的元素数量
语法:len(字典)
# 总计字典中的元素数量,len()函数 my_dict = {"aa": 89, "bb": 90, "cc": 77} num = len(my_dict) print(f"字典中的元素数量有:{num}个") 运行效果: 字典中的元素数量有:3个
字典的特点
- 可以容纳多个数据
- 可以容纳不同类型的数据
- 每一份数据是KeyValue键值对
- 可以通过Key获取Value,Key不可重复(重复会覆盖)
- 不支持下标索引
- 可以修改(增加或删除更新元素等)
- 支持for循环,不支持while循环
- 案例练习:升职加薪
""" 演示字典的课后练习:升职加薪,对所有级别为1级的员工,级别上升1级,薪水增加1000元 """ # 组织字典记录数据 info_dict = { "aa": { "部门": "科技部", "工资": 3000, "级别": 1 }, "bb": { "部门": "市场部", "工资": 5000, "级别": 1 }, "cc": { "部门": "科技部", "工资": 6000, "级别": 2 }, "dd": { "部门": "市场部", "工资": 8000, "级别": 3 }, "ee": { "部门": "科技部", "工资": 9000, "级别": 3 } } # 升职加薪之前的薪资 print(f"升职加薪之前的情况:{info_dict}") # for循环 for name in info_dict: # if条件判断复合条件员工 if info_dict[name]["级别"] == 1: # 升职加薪操作 # 获取到员工的信息字典 employee_info_dict = info_dict[name] # 修改员工的信息 employee_info_dict["级别"] = 2 # 级别+1 employee_info_dict["工资"] += 1000 # 工资+1000 # 将员工的信息更新回info_dict info_dict[name] = employee_info_dict # 输出结果 print(f"对员工进行升职加薪后的结果是:{info_dict}")