零基础学Python,今天带你搞懂列表和字典这两个最常用的数据结构
前面四天我们学了变量、条件判断和循环。有个问题不知道你想过没有——如果我要存100个学生的成绩,难道要写100个变量吗?
score1 = 85score2 = 92score3 = 78# ... 写到手抽筋
当然不用。Python提供了两个超级好用的"容器"——列表(list)和字典(dict),专门用来存一堆数据。
今天的目标很简单:学会用列表和字典装东西、取东西、改东西。
一、列表(list)——有序的"购物车"
列表就像超市的购物车,你可以往里面放任何东西,而且它们会按顺序排好。
创建列表
# 空列表my_list = []# 有数据的列表fruits = ["苹果", "香蕉", "橘子", "西瓜"]numbers = [1, 2, 3, 4, 5]mixed = ["hello", 42, True, 3.14] # 列表里可以放不同类型
列表用方括号 [] 包起来,里面的东西用逗号隔开。
按位置取东西(下标/索引)
列表里的每个元素都有一个"座位号",从 0 开始数:
fruits = ["苹果", "香蕉", "橘子", "西瓜"]print(fruits[0]) # 苹果 ← 第1个print(fruits[1]) # 香蕉 ← 第2个print(fruits[-1]) # 西瓜 ← 最后1个(-1表示倒数第一)print(fruits[-2]) # 橘子 ← 倒数第2个
💡 坑提醒: Python的索引从0开始,不是1!这是新手最常犯的错误。取第1个元素用 [0],不是 [1]。取第5个用 [4]。
修改列表元素
fruits[1] = "草莓"# 把第2个(香蕉)改成草莓print(fruits) # ['苹果', '草莓', '橘子', '西瓜']
添加和删除
# 往末尾添加fruits.append("葡萄")print(fruits) # ['苹果', '草莓', '橘子', '西瓜', '葡萄']# 往指定位置插入fruits.insert(1, "蓝莓") # 在第2个位置插入print(fruits) # ['苹果', '蓝莓', '草莓', '橘子', '西瓜', '葡萄']# 删除指定元素fruits.remove("橘子") # 删除"橘子"print(fruits) # ['苹果', '蓝莓', '草莓', '西瓜', '葡萄']# 按位置删除(用pop)popped = fruits.pop(2) # 删除第3个元素,并把它返回print(popped) # 草莓print(fruits) # ['苹果', '蓝莓', '西瓜', '葡萄']
列表的长度
print(len(fruits)) # 4
遍历列表(配合循环)
for fruit in fruits:print(f"今天吃{fruit}")# 输出:# 今天吃苹果# 今天吃蓝莓# 今天吃西瓜# 今天吃葡萄
如果既要下标又要值,用 enumerate:
for i, fruit inenumerate(fruits):print(f"第{i+1}个水果:{fruit}")
二、字典(dict)——带标签的"收纳盒"
列表的问题是:你只能通过"第几个"来找东西。但很多时候,我们更想通过"名字"来找。
比如存一个人的信息,用列表就很别扭:
person = ["张三", 25, "北京"]# 过两天回来看,你还记得第2个是啥吗?
这时候就该字典登场了。字典用花括号 {},里面是 键:值 对(key:value)。
创建字典
# 空字典my_dict = {}# 有数据的字典person = {"name": "张三","age": 25,"city": "北京"}
键(key)就像标签,值(value)就是标签对应的东西。
通过键取值
print(person["name"]) # 张三print(person["age"]) # 25
这比 person[0] 可读性强太多了吧?
还有一种更安全的取值方式——用 get 方法:
# 用"中括号"取,如果键不存在会报错# print(person["gender"]) # KeyError!# 用get取,键不存在返回None(或默认值)print(person.get("gender")) # Noneprint(person.get("gender", "未知")) # 未知(指定默认值)
💡 建议: 不确定键是否存在时,优先用 get,避免程序崩溃。
修改和添加
# 修改已有键的值person["age"] = 26# 添加新键值对person["gender"] = "男"person["job"] = "程序员"print(person)# {'name': '张三', 'age': 26, 'city': '北京', 'gender': '男', 'job': '程序员'}
删除
# 删除指定键del person["city"]print(person)# {'name': '张三', 'age': 26, 'gender': '男', 'job': '程序员'}# 弹出指定键(删除并返回值)job = person.pop("job")print(job) # 程序员print(person) # {'name': '张三', 'age': 26, 'gender': '男'}
遍历字典
# 遍历键for key in person:print(key)# 遍历值for value in person.values():print(value)# 同时遍历键和值for key, value in person.items():print(f"{key}: {value}")
三、列表和字典的嵌套——组合拳
列表里套字典,这个最常用:
students = [ {"name": "张三", "score": 85}, {"name": "李四", "score": 92}, {"name": "王五", "score": 78}]# 遍历所有学生的名字for stu in students:print(stu["name"])
字典里套列表:
classroom = {"class_name": "Python入门班","students": ["张三", "李四", "王五"],"teachers": ["陈老师", "刘老师"]}print(f"{classroom['class_name']}共有{len(classroom['students'])}名学生")
多层嵌套也不怕,一层层取就行:
data = { "users": [ {"id": 1, "name": "张三", "scores": {"python": 90, "java": 85}}, {"id": 2, "name": "李四", "scores": {"python": 95, "java": 88}} ]}# 取李四的Python成绩print(data["users"][1]["scores"]["python"]) # 95
💡 坑提醒: 多层嵌套时,逐层检查键是否存在。一行太长可以拆开写:
user = data["users"][1]score = user["scores"]["python"]
四、实战场景:统计全班成绩
来点实用的,写个统计全班成绩的小程序:
# 学生成绩数据students = [ {"name": "小明", "score": 88, "gender": "男"}, {"name": "小红", "score": 95, "gender": "女"}, {"name": "小刚", "score": 72, "gender": "男"}, {"name": "小丽", "score": 91, "gender": "女"}, {"name": "小强", "score": 65, "gender": "男"},]# 计算平均分total = 0for stu in students: total += stu["score"]average = total / len(students)print(f"全班平均分:{average:.1f}")# 找出最高分和最低分max_score = max(stu["score"] for stu in students) # 列表推导式,后面会学min_score = min(stu["score"] for stu in students)print(f"最高分:{max_score}")print(f"最低分:{min_score}")# 按分数排名(从高到低)ranked=sorted(students, key=lambda x: x["score"], reverse=True) # lambda后面也会学print("\n=== 成绩排名 ===")for i, stu inenumerate(ranked, 1):print(f"第{i}名:{stu['name']}{stu['score']}分")
输出:
全班平均分:82.2最高分:95最低分:65=== 成绩排名 ===第1名:小红 95分第2名:小丽 91分第3名:小明 88分第4名:小刚 72分第5名:小强 65分
你看,有了列表和字典,处理一批数据变得特别顺手。
五、今日小结
列表(list)的核心:
字典(dict)的核心:
可以动手试试:
- 把上面两个结合起来:创建一个"电影清单"字典,每个电影包含片名、评分、上映年份
- 写一个小程序,统计你最近一周每天的学习时间(用列表或字典都行)
下一期我们会讲元组与集合——那些不可变的和自动去重的好东西。敬请期待!
今天是 Day 5,我们走了近1/4的路程了。如果你是从Day 1一路跟下来的,你已经能用Python做不少事了。坚持住!