一、为什么需要列表和字典?
先想一个问题:假设你是个班主任,要记录全班40个同学的名字。之前的知识里,你可能会这样做:
name1 = "张三"
name2 = "李四"
name3 = "王五"
# ……天哪,要写40个变量!
这样做有两个明显的问题:第一,变量名太多,自己都会搞混;第二,如果要遍历全班同学(比如点名),根本没法批量处理。
列表(List)和字典(Dict)就是为了解决这类问题而生的。它们是 Python 里最常用的两种"容器"——说白了,就是用来装东西的。只不过它们比变量更聪明,能帮你组织、管理、查找大量数据。
二、列表:有序的数据集合
创建列表
列表用方括号 [] 来表示,元素之间用逗号分隔:
# 一个包含5个数字的列表
scores = [85, 92, 78, 96, 88]
# 一个包含4个字符串的列表
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
# 混合类型的列表(Python允许,但不推荐混用)
mixed = ["小明", 18, 1.75, True]
# 空列表
empty = []
访问列表元素
列表里的每个元素都有一个"编号",从 0 开始,这个编号叫索引(index)。
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
print(fruits[0]) # 苹果,第一个元素
print(fruits[1]) # 香蕉,第二个元素
print(fruits[2]) # 橙子,第三个元素
print(fruits[3]) # 葡萄,第四个元素
特别提醒:索引从 0 开始,不是从 1 开始。这是编程界的惯例,几乎所有编程语言都是这样。所以 fruits[0] 是第一个元素,fruits[3] 是第四个元素。如果写成 fruits[4],会报错——索引超出范围。
Python 还支持负数索引,表示"从右边数第几个":
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
print(fruits[-1]) # 葡萄,最右边一个
print(fruits[-2]) # 橙子,右边第二个
print(fruits[-4]) # 苹果,右边第四个
修改列表元素
列表是可变的——你可以随时修改、增加、删除元素:
fruits = ["苹果", "香蕉", "橙子"]
fruits[0] = "西瓜" # 把第一个元素改成"西瓜"
print(fruits) # ['西瓜', '香蕉', '橙子']
fruits.append("草莓") # 在末尾添加"草莓"
print(fruits) # ['西瓜', '香蕉', '橙子', '草莓']
fruits.insert(1, "桃子") # 在索引1的位置插入"桃子"
print(fruits) # ['西瓜', '桃子', '香蕉', '橙子', '草莓']
removed = fruits.pop() # 弹出并返回最后一个元素
print(removed) # 草莓
print(fruits) # ['西瓜', '桃子', '香蕉', '橙子']
列表切片:截取子列表
如果你只需要列表的一部分,可以用切片操作:
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[2:6]) # [2, 3, 4, 5],从索引2到索引6(不含6)
print(numbers[:4]) # [0, 1, 2, 3],从头到索引4(不含4)
print(numbers[6:]) # [6, 7, 8, 9],从索引6到末尾
print(numbers[::2]) # [0, 2, 4, 6, 8],每两个取一个(步长为2)
print(numbers[::-1]) # [9, 8, 7, 6, 5, 4, 3, 2, 1, 0],倒序
遍历列表
遍历就是"一个一个地取出列表中的元素"。for 循环和列表是天生一对:
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
for fruit in fruits:
print("我喜欢吃", fruit)
for fruit in fruits 的意思是:从 fruits 列表里依次取出每个元素,赋值给变量 fruit,然后执行循环体。
如果要同时获取元素和索引,用 enumerate() 函数:
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
for index, fruit in enumerate(fruits):
print(f"第{index + 1}个水果是:{fruit}")
三、字典:键值对的数据容器
列表适合存放"一串有序的数据",但有时候我们需要更灵活的组织方式——用名字来查找数据,而不是用数字索引。
比如存储一个学生的信息:姓名、年龄、班级、专业。如果用列表,你需要记住哪个位置存的是什么:
# 列表方式
student = ["张三", 19, "计算机1班", "软件工程"]
# 必须记住:索引0是姓名,1是年龄,2是班级,3是专业
字典则更直观——用键(key)来标识每个数据:
# 字典方式
student = {
"姓名": "张三",
"年龄": 19,
"班级": "计算机1班",
"专业": "软件工程"
}
# 用键来访问对应的值
print(student["姓名"]) # 张三
print(student["年龄"]) # 19
字典用大括号 {} 包裹,每个元素是一个"键值对"——键和值用冒号分隔,多个键值对之间用逗号分隔。
访问字典
# 用键访问值(如果键不存在会报错)
print(student["姓名"])
# 用 get 方法访问(键不存在时返回默认值,而不是报错)
print(student.get("电话", "暂无")) # 键不存在,返回"暂无"
# 添加或修改字典项
student["电话"] = "13800138000" # 添加新键值对
student["年龄"] = 20 # 修改已有的键值对
遍历字典
字典的遍历有三种常见方式:
student = {
"姓名": "张三",
"年龄": 19,
"班级": "计算机1班",
"专业": "软件工程"
}
# 遍历所有键
for key in student:
print(key)
# 遍历所有值
for value in student.values():
print(value)
# 同时遍历键和值
for key, value in student.items():
print(f"{key}:{value}")
四、列表和字典的组合使用
列表和字典可以互相嵌套,形成更复杂的数据结构。比如存储多个学生的信息:
students = [
{"姓名": "张三", "年龄": 19, "专业": "软件工程"},
{"姓名": "李四", "年龄": 20, "专业": "计算机科学"},
{"姓名": "王五", "年龄": 18, "专业": "信息安全"}
]
# 打印第二个学生的专业
print(students[1]["专业"]) # 计算机科学
# 遍历所有学生,打印姓名
for s in students:
print(s["姓名"])
这种"列表套字典"的结构在实际编程中非常常见,适合用来处理表格类数据。
五、综合实战:成绩统计小程序
# -*- coding: utf-8 -*-
# 学生成绩表(字典列表)
students = [
{"姓名": "小明", "语文": 85, "数学": 92, "英语": 78},
{"姓名": "小红", "语文": 90, "数学": 88, "英语": 95},
{"姓名": "小刚", "语文": 72, "数学": 95, "英语": 81},
{"姓名": "小丽", "语文": 88, "数学": 76, "英语": 89},
]
print("=" * 30)
print("学生成绩统计表")
print("=" * 30)
for student in students:
name = student["姓名"]
chinese = student["语文"]
math = student["数学"]
english = student["英语"]
total = chinese + math + english
average = total / 3
print(f"\n姓名:{name}")
print(f" 语文:{chinese}分")
print(f" 数学:{math}分")
print(f" 英语:{english}分")
print(f" 总分:{total}分,平均:{average:.1f}分")
运行结果:
==============================
学生成绩统计表
==============================
姓名:小明
语文:85分
数学:92分
英语:78分
总分:255分,平均:85.0分
姓名:小红
语文:90分
数学:88分
英语:95分
总分:273分,平均:91.0分
姓名:小刚
语文:72分
数学:95分
英语:81分
总分:248分,平均:82.7分
姓名:小丽
语文:88分
数学:76分
英语:89分
总分:253分,平均:84.3分
六、这篇我们学到了什么
核心知识点回顾:
- • 列表用
[] 表示,适合存储有序数据,元素用逗号分隔 - • 列表索引从 0 开始,负数索引表示从右边数
- • 列表切片
list[start:end] 可以截取子列表 - • 字典用
{} 表示,每个元素是键值对,用键(key)访问值(value) - • 字典的
get(key, default) 方法在键不存在时返回默认值而不是报错 - •
for...in 循环可以遍历列表和字典 - • 列表和字典可以互相嵌套,形成复杂的数据结构
代码示例汇总:
# -*- coding: utf-8 -*-
# 列表的创建和访问
fruits = ["苹果", "香蕉", "橙子", "葡萄"]
print(fruits[0]) # 苹果
print(fruits[-1]) # 葡萄
# 列表的增删改
fruits.append("草莓") # 末尾添加
fruits.insert(1, "桃子") # 指定位置插入
fruits[0] = "西瓜" # 修改元素
removed = fruits.pop() # 弹出末尾元素
# 列表切片
numbers = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(numbers[2:6]) # [2, 3, 4, 5]
print(numbers[::2]) # [0, 2, 4, 6, 8]
# 遍历列表
for fruit in fruits:
print(fruit)
# 字典的创建和访问
student = {"姓名": "张三", "年龄": 19, "班级": "计算机1班"}
print(student["姓名"])
print(student.get("电话", "暂无")) # 暂无
# 字典遍历
for key, value in student.items():
print(f"{key}:{value}")
# 列表套字典
students = [
{"姓名": "张三", "分数": 88},
{"姓名": "李四", "分数": 95},
]
for s in students:
print(f"{s['姓名']}的分数是{s['分数']}")
下篇预告:函数入门——把代码打包成工具。这是Python编程的核心技能之一,学会函数就能写出结构清晰、可复用的代码。