字典是日常编程最常用的数据结构,细节陷阱很多,学习结束之后欢迎在评论区留下你的测试代码、疑问,大家一起交流学习!
一、课程前言
前面我们已经学完序列容器:列表(list)、元组(tuple),二者依靠数字下标存取数据。
本节课学习字典 dict,属于映射型容器,键‑值(key‑value)结构,底层依靠哈希表实现,查询速度极快,适合用来保存一一对应的数据,例如个人信息、商品价格、账号资料、JSON数据等。
通俗类比:现实当中的新华字典,单词就是键key,汉字解释就是值value;输入单词,立刻查到释义,不需要从头翻找。
二、基础概念详解
1. 字典核心特性
1. 键值对存储:格式 key:value,依靠键查找数值,不再依靠数字下标
2. Python3.7及以上版本,默认保留插入顺序;旧版本无序
3. 键 key 唯一不可重复,重复写入相同键,后面的数据直接覆盖旧数值
4. 键必须为不可变、可哈希的数据:字符串、整数、浮点数、纯元素元组;列表、字典、集合这类可变类型不能充当键
5. 值 value 没有任何限制,可以存放列表、字典、布尔、嵌套数据
6. 可变容器,可以随时新增、修改、删除键值对
7. 查询效率极高,哈希表查找速度 O(1),数据再多查找耗时基本不变,远快于列表遍历查找
2. 多种字典创建方式(全套写法)
# 方式1:大括号创建,最常用student = {"name":"小李","age":16,"gender":"男"}# 空字典empty_dict = {}# 方式2:dict() 关键字参数创建person = dict(name="小王",height=172)# 方式3:嵌套列表、元组转换成字典goods = dict([("苹果",5),("香蕉",3)])# 方式4:fromkeys() 批量初始化字典# 所有键共用同一个初始数值name_list = ["a","b","c"]test_dict = dict.fromkeys(name_list,0)print(test_dict)
fromkeys易错细节:所有键指向同一个对象,如果初始值是列表,修改其中一个,全部键的值都会跟着改动
3. 合法键与非法键示例
# 合法键d1 = {100:"数字键","hello":"字符串键",(1,2):"元组键"}# 报错!列表属于可变对象,不可哈希,禁止作为key# d2 = {[1,2]:"测试"}
三、字典增、删、改、查完整代码案例
1. 增加、修改数据
字典新增键值对、修改数据语法一致:
键原本存在 → 修改旧的值
键不存在 → 添加全新键值对
info = {"name":"小张"}info["age"] = 18 # 新增info["name"] = "张三" # 修改原有键print(info)
2. 查询取值两种方式
① 中括号取值 字典[key]
键不存在直接抛出 KeyError 报错
price = {"可乐":3,"面包":6}print(price["可乐"])
② get()安全取值(开发首选,不会报错)
键不存在默认返回None,也可以自定义返回提示
print(price.get("可乐"))print(price.get("辣条","该商品不存在"))
3. 删除操作
d = {"a":1,"b":2,"c":3}# del:删除指定键值对del d["a"]# pop() 删除指定键,并且返回被删除的值res = d.pop("b")print(res)# popitem() 删除最后插入的一组键值对,返回元组print(d.popitem())# clear() 清空字典,变为空字典d.clear()
4. 提取键列表、值列表、键‑值对
data = {"name":"莉莉","age":17}print(data.keys()) # 获取所有键print(data.values()) # 获取所有数值print(data.items()) # 获取全部键值对元组
四、字典循环遍历
方式1:默认循环只读取键
user = {"name":"阿明","age":19}for k in user: print(k,user[k])
方式2:items() 同时取出键和值(最常用)
for key,value in user.items(): print(f"键:{key},值:{value}")
五、重点特殊知识点 & 高频踩坑点
坑1:键具备唯一性,重复键直接覆盖
test = {"num":10,"num":99}print(test)# 输出 {'num': 99},后面的数据覆盖前面
坑2:可变列表、字典无法充当字典键
因为列表随时可以修改内存数据,哈希值不稳定,不允许作为key;
只有固定不变的数据,才可以计算哈希地址。
坑3:字典属于可变对象,直接赋值会共用内存地址
dict1 = {"a":10}dict2 = dict1dict2["a"] = 99print(dict1)# dict1的数据同样被修改,二者指向同一块内存
字典独立拷贝写法:
坑4:嵌套字典(多层字典)取值
people = {"user":{"name":"小华","age":15}}print(people["user"]["name"])
坑5:in 判断只针对键,不会检索数值
d = {"x":66}print("x" in d) # Trueprint(66 in d) # False,in只查询key# 判断数值需要使用valuesprint(66 in d.values())
坑6、update()批量更新多个键值
a = {"name":"小明","age":12}a.update({"age":13,"gender":"男"})print(a)
存在的键就更新,全新键直接添加。
六、列表、元组、字典三者对比
| 标识 | 下标/索引 | 可变性 | 键要求 |
列表 list | [] | 数字下标 | 可变 | 无 |
元组 tuple | () | 数字下标 | 不可变 | 无 |
字典 dict | {} | 哈希键 key | 可变 | 必须不可变、可哈希 |
七、课后练习题(共3题)
习题1(基础题)
创建学生字典 stu = {"姓名":"李伟","年龄":17,"班级":"一班"},使用get方法获取“年龄”;尝试获取不存在的键“身高”,设置默认提示“暂无身高数据”。
习题2(易错填空题)
写出代码运行结果:
d = {"a":10,"a":88}print(d)
习题3(综合实操)
新建商品字典 shop = {"矿泉水":2,"饼干":5,"雪糕":3},遍历字典,打印每一个商品名称以及对应的价格。
字典的坑点集中在键的规则、赋值拷贝、in只检索键这些细节,如果代码报错或是知识点存在疑惑,可以在评论区留言,一起解决问题!