基本概念:什么是列表中的字典?
想象一下,你有一个学生名单,每个学生都有姓名、年龄和学号这些信息。
- 列表:就像一个名单,它按顺序存放所有学生。
- 字典:就像每个学生的信息卡,它通过键值对来存储具体信息(如
"name": "张三")。
将它们结合起来,列表中的字典就是这样一个结构:
students = [
{"name": "张三", "age": 20, "student_id": "S001"},
{"name": "李四", "age": 21, "student_id": "S002"},
{"name": "王五", "age": 19, "student_id": "S003"}
]
在这个例子中:
students是一个列表(用方括号[]表示)。- 列表里有3个元素,每个元素都是一个字典(用花括号 表示)。
- 每个字典都代表一个学生,包含了
"name","age","student_id"这三个键。
如何访问数据?
访问这种嵌套结构需要逐层深入,使用索引来访问列表,使用键来访问字典。
a. 访问整个字典(单个学生)
通过列表的索引,你可以获取到列表中的任何一个字典。
# 获取第一个学生(索引为0)的信息
first_student = students[0]
print(f"第一个学生是: {first_student}")
# 输出: 第一个学生是: {'name': '张三', 'age': 20, 'student_id': 'S001'}
b. 访问字典中的特定值(某个学生的某个属性)
先通过索引定位到字典,再通过键获取值。
# 获取第一个学生的姓名
first_student_name = students[0]["name"]
print(f"第一个学生的姓名是: {first_student_name}")
# 输出: 第一个学生的姓名是: 张三
# 获取第二个学生的年龄
second_student_age = students[1]["age"]
print(f"第二个学生的年龄是: {second_student_age}")
# 输出: 第二个学生的年龄是: 21
c. 使用循环遍历所有数据
这是最常用的操作,你可以遍历列表,对每个字典进行处理。
方法1:直接遍历列表
for student in students:
# student 变量依次指向列表中的每一个字典
print(f"姓名: {student['name']}, 年龄: {student['age']}")
输出:
姓名: 张三, 年龄: 20
姓名: 李四, 年龄: 21
姓名: 王五, 年龄: 19
方法2:使用 enumerate 获取索引和值
如果你需要在遍历时知道当前是第几个元素,enumerate 非常有用。
for index, student in enumerate(students):
print(f"索引 {index}: {student['name']} (学号: {student['student_id']})")
输出:
索引 0: 张三 (学号: S001)
索引 1: 李四 (学号: S002)
索引 2: 王五 (学号: S003)
如何修改、添加和删除数据?
a. 修改数据
找到对应的字典和键,然后直接赋新值。
# 将李四的年龄改为22
students[1]["age"] = 22
print("修改后的学生列表:")
print(students)
输出:
修改后的学生列表:
[{'name': '张三', 'age': 20, 'student_id': 'S001'}, {'name': '李四', 'age': 22, 'student_id': 'S002'}, {'name': '王五', 'age': 19, 'student_id': 'S003'}]
b. 添加新数据(添加新学生)
使用列表的 append() 方法在末尾添加一个新的字典。
new_student = {"name": "赵六", "age": 18, "student_id": "S004"}
students.append(new_student)
print("添加新学生后的列表:")
print(students)
输出:
添加新学生后的列表:
[{'name': '张三', 'age': 20, 'student_id': 'S001'}, {'name': '李四', 'age': 22, 'student_id': 'S002'}, {'name': '王五', 'age': 19, 'student_id': 'S003'}, {'name': '赵六', 'age': 18, 'student_id': 'S004'}]
c. 删除数据
有几种方式可以删除数据:
-
del语句:通过索引删除整个字典。# 删除索引为1的学生(李四) del students[1] print("删除李四后的列表:") print(students)输出:
删除李四后的列表: [{'name': '张三', 'age': 20, 'student_id': 'S001'}, {'name': '王五', 'age': 19, 'student_id': 'S003'}, {'name': '赵六', 'age': 18, 'student_id': 'S004'}] -
pop()方法:通过索引删除并返回被删除的元素。# 删除并返回索引为0的学生(张三) removed_student = students.pop(0) print(f"被删除的学生是: {removed_student}") print("使用pop删除后的列表:") print(students)输出:
被删除的学生是: {'name': '张三', 'age': 20, 'student_id': 'S001'} 使用pop删除后的列表: [{'name': '王五', 'age': 19, 'student_id': 'S003'}, {'name': '赵六', 'age': 18, 'student_id': 'S004'}] -
从字典中删除键值对:如果你只想删除某个学生的某个属性,而不是整个学生。
# 删除赵六的年龄 students[2].pop("age") print("删除赵六年龄后的列表:") print(students)输出:
删除赵六年龄后的列表: [{'name': '王五', 'age': 19, 'student_id': 'S003'}, {'name': '赵六', 'student_id': 'S004'}]
常用操作和技巧
a. 根据条件筛选数据
找出所有年龄大于等于20岁的学生。
adult_students = [student for student in students if student["age"] >= 20]
print("年龄大于等于20岁的学生:")
print(adult_students)
输出:
年龄大于等于20岁的学生:
[{'name': '王五', 'age': 19, 'student_id': 'S003'}]
注意:这里原 students 列表已经被之前的操作修改了。
b. 根据某个值查找字典
根据学号 S003 找到对应的学生。
student_id_to_find = "S003"
found_student = None # 先初始化一个变量
for student in students:
if student["student_id"] == student_id_to_find:
found_student = student
break # 找到后就可以退出循环了
if found_student:
print(f"找到了学号为 {student_id_to_find} 的学生: {found_student}")
else:
print(f"没有找到学号为 {student_id_to_find} 的学生。")
输出:
找到了学号为 S003 的学生: {'name': '王五', 'age': 19, 'student_id': 'S003'}
| 操作 | 代码示例 | 说明 |
|---|---|---|
| 创建 | my_list = [{"k1": "v1"}, {"k2": "v2"}] |
列表包含多个字典。 |
| 访问整个元素 | item = my_list[0] |
通过列表索引获取字典。 |
| 访问元素内的值 | value = my_list[0]["k1"] |
先用索引,再用键获取值。 |
| 遍历 | for item in my_list: ... |
遍历列表中的每个字典。 |
| 修改值 | my_list[0]["k1"] = "new_value" |
直接对指定键赋值。 |
| 添加元素 | my_list.append({"k3": "v3"}) |
在列表末尾添加新字典。 |
| 删除元素 | del my_list[0] 或 my_list.pop(0) |
删除整个字典。 |
| 删除键值对 | my_list[0].pop("k1") |
从字典中删除一个键。 |
| 筛选 | [item for item in my_list if item["k1"] == "v1"] |
使用列表推导式筛选。 |
列表中字典的结构是 Python 编程中处理结构化数据的核心模式,熟练掌握它对数据处理、API 响应解析、配置文件管理等任务至关重要。
