日照市网站建设_网站建设公司_CSS_seo优化
2025/12/21 13:10:08 网站建设 项目流程

在上一篇《Python数据结构(上)》中,我们介绍了列表(list)和元组(tuple)这两种常用的数据结构。本篇将继续深入,介绍另外两种重要的内置数据结构——字典(dictionary)集合(set),并结合实际案例进行综合练习,帮助你更好地掌握它们的应用场景与操作方法。


一、字典(Dictionary)

1.1 什么是字典?

字典是 Python 中一种无序、可变、键值对(key-value pair)存储的数据结构。它用花括号{}定义,每个元素由一个“键”和一个“值”组成,通过键来快速查找对应的值。

✅ 特点:

  • 键必须是不可变类型(如字符串、数字、元组)
  • 值可以是任意类型
  • 键具有唯一性,不允许重复

1.2 创建字典

# 方法1:直接定义

student = {

"name": "张三",

"age": 20,

"major": "计算机科学"

}

# 方法2:使用 dict() 构造函数

person = dict(name="李四", age=22, city="北京")

# 方法3:从键值对列表创建

data = [("a", 1), ("b", 2)]

d = dict(data) # {'a': 1, 'b': 2}

1.3 字典的基本操作

# 访问值

print(student["name"]) # 输出:张三

# 添加或修改

student["grade"] = "大二" # 添加新键值对

student["age"] = 21 # 修改已有值

# 删除键值对

del student["major"]

# 检查键是否存在

if "name" in student:

print("存在 name 键")

# 获取所有键、值、键值对

print(student.keys()) # dict_keys(['name', 'age', 'grade'])

print(student.values()) # dict_values(['张三', 21, '大二'])

print(student.items()) # dict_items([('name', '张三'), ('age', 21), ('grade', '大二')])

1.4 遍历字典

for key in student:

print(key, ":", student[key])

# 或更推荐的方式

for key, value in student.items():

print(f"{key}: {value}")


二、集合(Set)

2.1 什么是集合?

集合是一种无序、不重复元素的容器,常用于去重和集合运算(如并集、交集等)。集合使用花括号{}set()函数创建,注意:空集合只能用set()创建,{}表示空字典。

✅ 特点:

  • 元素唯一,自动去重
  • 元素必须是不可变类型
  • 不支持索引访问

2.2 创建集合

# 方法1:使用花括号(非空时)

fruits = {"apple", "banana", "apple", "orange"}

print(fruits) # {'apple', 'banana', 'orange'} —— 自动去重

# 方法2:使用 set() 函数

numbers = set([1, 2, 2, 3, 4]) # {1, 2, 3, 4}

# 空集合

empty_set = set()

2.3 集合的基本操作

# 添加元素

fruits.add("grape")

# 删除元素

fruits.remove("banana") # 若不存在会报错

fruits.discard("kiwi") # 安全删除,不存在也不报错

# 集合运算

set_a = {1, 2, 3}

set_b = {3, 4, 5}

print(set_a | set_b) # 并集: {1, 2, 3, 4, 5}

print(set_a & set_b) # 交集: {3}

print(set_a - set_b) # 差集: {1, 2}

print(set_a ^ set_b) # 对称差集: {1, 2, 4, 5}


三、字典 vs 集合 vs 列表对比

特性列表(list)字典(dict)集合(set)
是否有序否(Python 3.7+ 保持插入顺序)
是否可变
元素是否唯一键唯一,值可重复
访问方式索引(如 list[0])键(如 dict['name'])不支持索引
典型用途存储有序数据存储键值映射去重、集合运算

四、综合练习:学生成绩管理系统

下面我们通过一个实际案例,综合运用列表、字典和集合,实现一个简单的学生成绩管理功能。

需求描述:

  1. 存储多个学生的姓名、年龄、科目成绩(数学、英语)
  2. 支持添加学生、查询平均分、统计不及格人数
  3. 统计所有出现过的科目(使用集合去重)
  4. 找出数学和英语都及格的学生名单

实现代码:

# 学生数据列表,每个学生是一个字典

students = [

{"name": "张三", "age": 20, "math": 85, "english": 78},

{"name": "李四", "age": 19, "math": 56, "english": 92},

{"name": "王五", "age": 21, "math": 73, "english": 65},

{"name": "赵六", "age": 20, "math": 90, "english": 88}

]

# 1. 添加新学生

def add_student(name, age, math, english):

students.append({

"name": name,

"age": age,

"math": math,

"english": english

})

add_student("钱七", 19, 45, 70)

# 2. 计算所有学生的平均分

def average_score(subject):

total = sum(s[subject] for s in students)

return total / len(students)

print(f"数学平均分: {average_score('math'):.2f}")

print(f"英语平均分: {average_score('english'):.2f}")

# 3. 统计不及格人数(任一科目 < 60)

fail_count = 0

for s in students:

if s["math"] < 60 or s["english"] < 60:

fail_count += 1

print(f"不及格人数: {fail_count}")

# 4. 使用集合获取所有科目(扩展性好)

subjects = set()

for s in students:

subjects.update(s.keys())

# 过滤掉非成绩字段

subjects = {s for s in subjects if s in ["math", "english"]}

print("所有科目:", subjects)

# 5. 找出两科都及格的学生

good_students = []

for s in students:

if s["math"] >= 60 and s["english"] >= 60:

good_students.append(s["name"])

print("双科及格学生:", good_students)

输出结果:

数学平均分: 76.80 英语平均分: 78.20 不及格人数: 2 所有科目: {'math', 'english'} 双科及格学生: ['张三', '王五', '赵六']

五、小结

  • 字典适用于需要通过“键”快速查找“值”的场景,如配置信息、用户资料等。
  • 集合擅长处理去重和集合运算,在数据分析、筛选中非常实用。
  • 在实际开发中,经常将列表 + 字典 + 集合组合使用,发挥各自优势。

掌握这些数据结构,不仅能提升代码效率,还能让你写出更清晰、更易维护的程序。


六、课后练习

  1. 编写一个函数,接收一个单词列表,返回每个单词中不同字母组成的集合。
  2. 使用字典统计一段文本中每个字符出现的次数。
  3. 模拟两个班级的学生名单(用集合),找出共同参加活动的学生(交集)。

💡 提示:多动手实践是掌握数据结构的最佳方式!

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询