零基础学Python:Day8!字典:用键值对轻松管理结构化数据
昨天我们学习了Python中最常用的数据结构——列表,可以轻松存储一堆有序数据。今天我们继续学习另一个超级实用的数据结构——字典(Dict)!有了字典,我们就可以用键值对的方式存储结构化数据,比如一个人的姓名、年龄、身高、体重,管理起来比列表更直观,实际开发中用得非常多~老规矩,先公布昨天的作业答案。
📋 昨日作业答案
1. 定义一个列表存储最喜欢的5部电影,完成系列操作
操作步骤:输出第二部电影 → 输出倒数第一部 → 添加新电影到末尾 → 删除第三部 → 遍历输出
# 定义列表,存储5部电影movies = ["肖申克的救赎", "阿甘正传", "星际穿越", "盗梦空间", "楚门的世界"]# 输出第二部电影(索引是1)print("第二部电影:", movies[1])# 输出倒数第一部电影print("最后一部电影:", movies[-1])# 添加一部新电影到末尾movies.append("星际迷航")# 删除第三部电影(索引是2)del movies[2]# 遍历整个列表输出所有电影print("\n最终列表:")for movie in movies:print(movie)
运行结果:
第二部电影: 阿甘正传最后一部电影: 楚门的世界最终列表:肖申克的救赎阿甘正传盗梦空间楚门的世界星际迷航
完美,所有操作都完成了,你做对了吗?
2. 计算列表中所有数字的和与平均值
列表:numbers = [12, 34, 5, 43, 27, 8, 19, 46]
numbers = [12, 34, 5, 43, 27, 8, 19, 46]total = 0for num in numbers: total += numavg = total / len(numbers)print(f"总和:{total}, 平均值:{avg:.2f}")
运行结果:
总和:194, 平均值:24.25
3. 去除列表中重复的名字
列表:names = ["小明", "小红", "小刚", "小丽", "小明", "小强", "小红"]
思路:新建一个空列表,遍历原来的列表,如果名字不在新列表里,就加进去,这样就不会有重复了。
names = ["小明", "小红", "小刚", "小丽", "小明", "小强", "小红"]new_names = []for name in names:if name not in new_names: new_names.append(name)print(new_names)
运行结果:
['小明', '小红', '小刚', '小丽', '小强']
完美,没有重复了,这个思路非常容易理解,新手也能写出来。当然Python还有更简单的方法(用集合),我们后面会学到。
4. 用嵌套列表实现九九乘法表
思路:外层循环控制行(1-9),内层循环控制列(1-当前行),把每一行的结果存入列表,最后把所有行存入大列表。
# 存储整个九九乘法表multi_table = []# 行从1到9for i in range(1, 10):# 每一行又是一个列表 row = []# 列从1到当前行ifor j in range(1, i+1): row.append(f"{j}×{i}={i*j}")# 把当前行加入大列表 multi_table.append(row)# 遍历输出九九乘法表for row in multi_table:for item in row:# 左对齐,占8个字符位置,好看对齐print(f"{item:<8}", end="")print()
运行结果:
1×1=1 1×2=2 2×2=4 1×3=3 2×3=6 3×3=9 1×4=4 2×4=8 3×4=12 4×4=16 1×5=5 2×5=10 3×5=15 4×5=20 5×5=25 1×6=6 2×6=12 3×6=18 4×6=24 5×6=30 6×6=36 1×7=7 2×7=14 3×7=21 4×7=28 5×7=35 6×7=42 7×7=49 1×8=8 2×8=16 3×8=24 4×8=32 5×8=40 6×8=48 7×8=56 8×8=64 1×9=9 2×9=18 3×9=27 4×9=36 5×9=45 6×9=54 7×9=63 8×9=72 9×9=81
太工整了!完美实现了九九乘法表,用到了我们刚学的嵌套列表,是不是很有成就感?
好啦,都对完答案了,我们开始今天的正题——字典,这是Python里第二常用的数据结构,和列表搭配使用,简直无敌,赶紧学起来吧~
🤔 为什么需要字典?
我们之前学了列表,可以存储一组数据,那如果我们要存储一个人的具体信息,比如:姓名叫小明,年龄18岁,身高1.75米,体重65公斤,用列表怎么存?
person = ["小明", 18, 1.75, 65]
这样确实存进去了,但是你取数据的时候就麻烦了,你得记住姓名是索引0,年龄索引1,身高索引2,体重索引3,如果数据多了,你根本记不住哪个对应哪个,太容易搞混了。
而且如果顺序变了,比如改成[18, "小明", 1.75, 65],数据就全错了。
有了字典,我们就可以用键值对的方式存储数据,每个数据都有自己的“键(key)”,通过键就能快速拿到对应的值(value),根本不用记索引:
person = {"name": "小明","age": 18,"height": 1.75,"weight": 65}
你看,是不是一目了然?想拿姓名直接用person["name"],想拿年龄直接用person["age"],根本不用记顺序和索引,太直观了!
简单来说:字典是Python中用来存储键值对的无序容器,每个值都可以通过它的键快速查找,非常适合存储结构化数据。
字典基础:怎么定义字典?
定义字典非常简单,用**大括号{}**把键值对括起来,多个键值对之间用逗号隔开,每个键值对是键:值的格式,语法就是这样:
# 空字典,什么数据都没有empty_dict = {}# 存储个人信息的字典person = {"name": "小明","age": 18,"height": 1.75,"is_student": True}# 存储商品信息的字典goods = {"id": 1001,"name": "苹果手机","price": 5999,"colors": ["黑色", "白色", "蓝色"]}
你看,定义字典是不是超级简单?值可以是任意类型:数字、字符串、列表、甚至另一个字典,非常灵活。
⚠️ 注意:字典的键必须是不可变类型,一般用字符串或者数字,不能用列表当键哦(列表是可变的),值没有限制,什么都可以。
另外,字典里的键是唯一的,不能有两个相同的键,如果重复了,后面的会覆盖前面的。
怎么从字典里取数据?通过键拿值
定义好了字典,怎么取数据呢?超级简单,直接用字典名[键]就能拿到对应的值:
person = {"name": "小明","age": 18,"height": 1.75}print(person["name"]) # 输出: 小明print(person["age"]) # 输出: 18print(person["height"]) # 输出: 1.75
是不是比列表直观太多了?根本不用记索引,看键就知道拿什么数据。
避免键不存在报错:get()方法
如果你写的键不存在字典里,直接用[]取会报错:
person = {"name": "小明", "age": 18}print(person["weight"])
会报错:
KeyError: 'weight'
这个时候我们可以用get()方法,它非常友好,如果键不存在,不会报错,会返回None,你还可以指定默认值:
person = {"name": "小明", "age": 18}# 键不存在,返回Noneprint(person.get("weight")) # 输出: None# 指定默认值,键不存在就返回默认值print(person.get("weight", 65)) # 输出: 65,键不存在,返回我们给的默认值65
太人性化了吧!所以当你不确定键是否存在的时候,用get()就不会报错,非常好用。
怎么修改字典?增删改查都搞定
字典也是可变的,我们可以随时添加、修改、删除键值对,一个个来看:
1. 添加/修改元素:直接赋值
给字典添加新元素或者修改已有元素,都直接用字典名[键] = 值就好了:
举个例子:
person = {"name": "小明", "age": 18}print("修改前:", person) # 修改前: {'name': '小明', 'age': 18}# 修改已有键age的值person["age"] = 19print("修改age后:", person) # 修改age后: {'name': '小明', 'age': 19}# 添加新的键weightperson["weight"] = 65print("添加weight后:", person) # 添加weight后: {'name': '小明', 'age': 19, 'weight': 65}
就这么简单,直接赋值,是修改还是添加自动判断,太方便了!
2. 删除元素:pop()、del
删除键值对,常用两种方法:
pop():删除指定键的键值对,并且返回删除的值:
person = {"name": "小明", "age": 18, "weight": 65}age = person.pop("age")print(f"删除了age,值是:{age}") # 删除了age,值是:18print("删除后:", person) # 删除后: {'name': '小明', 'weight': 65}
del:Python关键字,直接删除指定键:
person = {"name": "小明", "age": 18, "weight": 65}del person["age"]print(person) # 输出: {'name': '小明', 'weight': 65}
3. 清空字典:clear()
想清空字典里所有元素,直接用clear():
person = {"name": "小明", "age": 18}person.clear()print(person) # 输出: {},空字典
4. 检查键是否存在:in关键字
想判断某个键是否在字典里,直接用in就好了,非常方便:
person = {"name": "小明", "age": 18}print("name" in person) # 输出: True,键存在print("weight" in person) # 输出: False,键不存在
实际开发中经常用这个判断,非常好用。
字典常用遍历方法
我们经常需要遍历字典,常见的有三种遍历方式,我们一个个来看:
1. 遍历所有键:keys()方法
keys()方法会返回字典所有的键,我们可以用for循环遍历:
person = {"name": "小明", "age": 18, "weight": 65}for key in person.keys():print(key)
输出:
nameageweight
2. 遍历所有值:values()方法
values()方法会返回字典所有的值:
person = {"name": "小明", "age": 18, "weight": 65}for value in person.values():print(value)
输出:
小明1865
3. 同时遍历键和值:items()方法(最常用)
items()方法会返回所有的键值对,我们可以同时拿到键和值,这是实际开发中最常用的遍历方式:
person = {"name": "小明", "age": 18, "weight": 65}for key, value in person.items():print(f"{key}: {value}")
输出:
name: 小明age: 18weight: 65
太方便了,一目了然,同时拿到键和值,处理起来超级简单。
字典嵌套:存储更复杂的数据
字典和列表一样,也支持嵌套,你可以在字典里放字典,也可以在列表里放字典,这样就能存储非常复杂的数据了,我们举个实际的例子:
比如我们要存储一个班级所有学生的信息,每个学生是一个字典,然后把所有学生字典放到一个列表里,完美:
# 班级所有学生列表,每个学生是一个字典class_students = [ {"name": "小明", "age": 18, "score": 95}, {"name": "小红", "age": 17, "score": 98}, {"name": "小刚", "age": 18, "score": 88}]# 怎么取数据呢?比如取出小红的分数print(class_students[1]["score"]) # 输出: 98
太直观了!列表存多个,每个元素是字典存详细信息,这是实际开发中非常常见的数据格式,很多接口返回的数据都是这种结构,所以一定要掌握哦。
我们再遍历一下,输出所有学生的信息:
for student in class_students:print(f"姓名:{student['name']}, 年龄:{student['age']}, 分数:{student['score']}")
输出:
姓名:小明, 年龄:18, 分数:95姓名:小红, 年龄:17, 分数:98姓名:小刚, 年龄:18, 分数:88
完美,清晰明了。
再举一个字典嵌套字典的例子,比如存储多个商品信息,用商品id当键,商品字典当值:
# 商品字典,键是商品id,值是商品详情字典goods_dict = {1001: {"name": "苹果手机", "price": 5999, "stock": 100},1002: {"name": "华为手机", "price": 4999, "stock": 80},1003: {"name": "小米手机", "price": 3999, "stock": 120}}# 获取1