上节课我们主要学习了变量、常见的数据类型:整形、浮点数、字符串、布尔值。
本节课我们继续学习剩余的数据类型:列表、元组、字典、集合以及相关的操作。
1. 列表(list)
1.1 概念
列表是一种有序、可变的数据类型,用于存储一组任意类型的元素。
特点:
- 有序性:列表中的元素按插入顺序存储。
- 可变性:可以动态地增加、删除或修改元素。
- 可重复:可以包含重复的元素。
语法格式:变量名 = [666,3306,996,007],用方括号表示。
1.2 基本操作
基本操作主要就是**对数据的增、删、改、查。**我们用具体的代码理解这个数据类型:
# 定义一个待办清单
todo_list = ["买牛奶", "还书", "锻炼身体"]
# 查看清单内容
print(todo_list) # 输出:['买牛奶', '还书', '锻炼身体']
# 添加新待办
todo_list.append("学习Python")
print(todo_list) # 输出:['买牛奶', '还书', '锻炼身体', '学习Python']
# 完成任务后删除
todo_list.remove("还书")
print(todo_list) # 输出:['买牛奶', '锻炼身体', '学习Python']
# 修改任务
todo_list[0] = "买酸奶"
print(todo_list) # 输出:['买酸奶', '锻炼身体', '学习Python']
# 二维列表:二维列表用于存储多行数据,每一行是一个列表,二维列表可以用来表示表格或矩阵。
# 假设每天的待办清单不同
todo_lists = [["买牛奶", "还书", "锻炼身体"], ["买果汁", "打扫卫生", "学习Python"]]
# 查看第一天的任务
print(todo_lists[0]) # 输出:['买牛奶', '还书', '锻炼身体']
# 查看第二天的任务
print(todo_lists[1]) # 输出:['买果汁', '打扫卫生', '学习Python']
1.3 其他常用操作
**切片:**可以将列表切分为不同的部分,即“切片”,语法:查看前 i 项:i,后 j 项-j:
例如待办分为上午和下午的任务,可以用切片分开管理。
todo_list = ["买酸奶", "锻炼身体", "学习Python", "看电影", "遛狗"]
# 上午的任务(前两项)
today_tasks = todo_list[:2]
print(today_tasks) # 输出:['买酸奶', '锻炼身体']
# 下午的任务(后两项)
tomorrow_tasks = todo_list[-2:]
print(tomorrow_tasks) # 输出:['看电影', '遛狗']
**列表推导:**通过循环可以快速生成列表
# 一周计划:每天重复练习Python 1~7天
weekly_plan = [f"第{i}天学习Python" for i in range(1, 8)]
print(weekly_plan)
# 输出:['第1天学习Python', '第2天学习Python', ..., '第7天学习Python']
**排序、取列表长度:**Python 的 sorted() 默认使用 Timsort 算法,如果你希望更改排序算法(例如使用快速排序、冒泡排序等),需要自己实现排序算法。
# 获取列表长度
tasks = ["买牛奶", "锻炼身体", "学习Python"]
print(len(tasks)) # 输出:3
# 排序一个列表
scores = [85, 95, 76, 88]
sorted_scores = sorted(scores)
print(sorted_scores) # 输出:[76, 85, 88, 95]
# 检查元素是否存在
print("买牛奶" in tasks) # 输出:True
2. 元组(tuple)
2.1 概念
元组最大特点是**不可修改性,**它是一种有序、不可变的数据类型,用于存储一组任意类型的元素。非常适合存储在程序运行过程中不应改变的值,如数据库连接参数。
特点:
- 有序性:元素按插入顺序存储。
- 不可变性:一旦定义,元组中的元素不能被修改。
- 可重复:可以包含重复的元素。
语法格式:变量名 = ("x",3306,996,"007","root"),就是将列表中的方括号改成了圆括号。
2.2 基本操作
我们依然通过例子来说明元组的基本操作。
# 定义餐厅的招牌菜元组
signature_dishes = ("红烧肉", "酸菜鱼", "宫保鸡丁")
# 查看某道招牌菜
print(signature_dishes[1]) # 输出:酸菜鱼
# 尝试修改招牌菜(将报错)
# signature_dishes[0] = "水煮鱼"
# 报错:TypeError: 'tuple' object does not support item assignment
元组定义后无法修改,因此也没有增、删、改的操作。
3. 字典(dict)
3.1 概念
字典是一种无序的、可变的数据类型,用于存储键值对(key-value pairs)。每个键(Key)是唯一的,键与值通过映射关系绑定。
特点:
- 无序性:Python 3.7+ 中字典的键值对是按插入顺序存储的,但逻辑上仍被视为无序。
- 可变性:可以动态地增加、删除或修改键值对。
- 键的唯一性:字典中的键不能重复。
语法格式:变量名 = {"port":"3306","user":"root"},用花括号括住,内容总是成对出现。
3.2 基本操作
我们用快递收件地址为例。已知信息(收件人:张三,地址:北京市海淀区,物品:书籍)
# 定义订单信息
order_info = {"name": "张三", "address": "北京市海淀区", "item": "书籍"}
# 查看某关键字的值
print(order_info["name"]) # 输出:张三
# 修改关键字的值
order_info["address"] = "上海市浦东新区"
print(order_info)
# 输出:{'name': '张三', 'address': '上海市浦东新区', 'item': '书籍'}
# 增加新的关键字
order_info["phone"] = "12345678901"
print(order_info)
# 输出:{'name': '张三', 'address': '上海市浦东新区', 'item': '书籍', 'phone': '12345678901'}
# 删除关键字
order_info.pop("phone")
print(order_info)
# 输出:{'name': '张三', 'address': '上海市浦东新区', 'item': '书籍'}
#清空字典
order_info.clear()
# 输出:{}
3.3 其他常用操作
# 1. 获取所有键、值和键值对
keys = person.keys() # 获取所有键
values = person.values() # 获取所有值
items = person.items() # 获取所有键值对
print("字典的所有键:", keys) # 输出:dict_keys(['name', 'age', 'city', 'hobbies'])
print("字典的所有值:", values) # 输出:dict_values(['小明', 18, '北京', ['跑步', '游泳']])
print("字典的所有键值对:", items) # 输出:dict_items([('name', '小明'), ('age', 18), ('city', '北京'), ('hobbies', ['跑步', '游泳'])])
# 2. 使用 get() 获取值(当键不存在时返回默认值)
print("获取name:", person.get("name")) # 输出:小明
print("获取gender(不存在的键,返回默认值):", person.get("gender", "未知")) # 输出:未知
# 3. 使用 'in' 检查键是否存在
if "age" in person:
print("年龄在字典中") # 输出:年龄在字典中
# 4. 使用 update() 合并字典
new_info = {"gender": "男", "city": "广州"}
person.update(new_info) # 合并 new_info 字典
print("合并后的字典:", person) # 输出:{'name': '小明', 'age': 19, 'gender': '男', 'city': '广州'}
# 5. 字典的嵌套(类似二维数组)
user_info = {
"user1": {"name": "小明", "age": 18},
"user2": {"name": "小红", "age": 20},
}
print("获取user1的详细信息:", user_info["user1"]) # 输出:{'name': '小明', 'age': 18}
另外, Python 中的字典与 JSON 格式非常相似,因此可以很容易地进行转换。
JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,经常用于前后端之间的数据传输,也是以键值对的形式存储数据。
一个 json 表单
4. 集合(set)
4.1 概念
集合是一种无序的、可变的数据类型,用于存储唯一的元素。集合中的元素没有重复,也没有固定顺序。
特点:
- 无序性:集合中的元素没有插入顺序。
- 唯一性:集合中的每个元素都是唯一的,重复元素会自动被去重。
- 可变性:集合可以动态地增加或删除元素。
语法格式:变量名 = {"x","y","z"}
4.2 基本操作
添加元素:使用 add() 或 update() 方法。
删除元素:使用 remove() 或 discard() 或 pop() 方法。
查找元素:使用 in 操作符。
# 定义一个集合
fruits = {"苹果", "香蕉", "橙子"}
# 添加元素
fruits.add("葡萄") # 使用 add 添加一个元素
print(fruits) # 输出:{'苹果', '香蕉', '橙子', '葡萄'}
# 添加多个元素
fruits.update(["梨子", "草莓"]) # 使用 update 添加多个元素
print(fruits) # 输出:{'苹果', '香蕉', '橙子', '葡萄', '梨子', '草莓'}
# 删除元素
fruits.remove("香蕉") # 使用 remove 删除指定元素,元素不存在会报错
print(fruits) # 输出:{'苹果', '橙子', '葡萄', '梨子', '草莓'}
# 删除不存在的元素会引发错误
# fruits.remove("柚子") # 错误:KeyError: '柚子'
# 使用 discard 删除元素,如果元素不存在,不会报错
fruits.discard("柚子") # 不会抛出错误
print(fruits) # 输出:{'苹果', '橙子', '葡萄', '梨子', '草莓'}
# 随机删除一个元素
random_fruit = fruits.pop() # 随机删除一个元素
print(f"被删除的元素是: {random_fruit}") # 输出:被删除的元素是: 苹果
print(fruits) # 输出:剩下的水果集合
# 查找元素
print("葡萄" in fruits) # 输出:True
print("香蕉" in fruits) # 输出:False
4.3其他常用操作
集合还支持一些常用的数学运算操作。
# 定义两个集合
constant_numbers = {1, 2, 3} # 常数集合
irrational_numbers = {3.14159, 2.71828, 1.41421} # 无理数集合
# 并集:获取两个集合的所有元素
all_numbers = constant_numbers | irrational_numbers # 使用 | 运算符
print("所有数:", all_numbers) # 输出:{1, 2, 3, 3.14159, 2.71828, 1.41421}
# 交集:获取两个集合的共同元素
common_numbers = constant_numbers & irrational_numbers # 使用 & 运算符
print("共同的数:", common_numbers) # 输出:set()
# 差集:获取在第一个集合中而不在第二个集合中的元素
constant_only_numbers = constant_numbers - irrational_numbers # 使用 - 运算符
print("常数独有的数:", constant_only_numbers) # 输出:{1, 2, 3}
# 对称差集:获取两个集合中的不重复的元素
unique_numbers = constant_numbers ^ irrational_numbers # 使用 ^ 运算符
print("独一无二的数:", unique_numbers) # 输出:{1, 2, 3, 3.14159, 2.71828, 1.41421}
# 子集判断:判断一个集合是不是另一个集合的子集
is_subset = constant_numbers.issubset(all_numbers) # 使用 issubset 方法
print("常数集合是所有数的子集吗?", is_subset) # 输出:True
# 超集判断:判断一个集合是不是另一个集合的超集
is_superset = all_numbers.issuperset(constant_numbers) # 使用 issuperset 方法
print("所有数是常数集合的超集吗?", is_superset) # 输出:True
5.小练习:实现一个完整的待办清单
如果要你设计一个待办清单管理系统,该如何用代码表示任务、管理任务的状态,以及实现增删改查?
任务清单用什么数据类型来保存?任务的完成状态怎么标记?如何根据用户输入来操作清单?
利用本节刚刚学到的知识,相信你也可以实现一个简单的待办清单工具。
完整代码如下:
#初始化待办列表
tasks = []
# 主循环,用户交互
while True:
# 打印主菜单,供用户选择
print("\n--- TodoList管理系统 ---")
print("1. 显示任务清单")
print("2. 添加任务")
print("3. 删除任务")
print("4. 修改任务")
print("5. 标记任务完成/未完成")
print("6. 退出")
# 获取用户选择,使用字符串存储用户输入
choice = input("请选择操作(1-6):")
if choice == "1":
# 显示任务清单
if not tasks: # 使用列表的布尔值检查是否为空
print("当前没有任务!💔")
else:
print("\n当前任务清单:")
# 使用 enumerate() 遍历列表,并输出任务编号、任务名称和完成状态
for idx, (task, completed) in enumerate(tasks, start=1):
# 状态用布尔值决定显示 ✅ 或 ❌
status = "✅" if completed else "❌"
print(f"{idx}. {task} {status}")
elif choice == "2":
# 添加任务
tasks_input = input("请输入多个任务(用空格分隔):") # 获取用户输入的多个任务
# 使用字符串的 split() 方法将输入按空格分割为任务列表
tasks_list = tasks_input.split()
for task in tasks_list:
# 将每个任务存储为元组,默认完成状态为 False
tasks.append((task, False))
print(f"任务 '{', '.join(tasks_list)}' 已成功添加!🎉")
elif choice == "3":
# 删除任务
task_number = int(input("请输入要删除的任务编号:")) # 将用户输入转换为整数
if 1 <= task_number <= len(tasks): # 检查编号是否有效
# 使用列表的 pop() 方法删除任务,返回被删除的任务
removed_task, _ = tasks.pop(task_number - 1)
print(f"任务 '{removed_task}' 已成功删除!🚮")
else:
print("无效的任务编号!⚠️")
elif choice == "4":
# 修改任务
task_number = int(input("请输入要修改的任务编号:"))
if 1 <= task_number <= len(tasks):
new_task = input("请输入修改后的任务:") # 获取新的任务名称
# 使用列表索引更新元组中的任务名称,保持完成状态不变
tasks[task_number - 1] = (new_task, tasks[task_number - 1][1])
print(f"任务已修改为:'{new_task}' ✏️")
else:
print("无效的任务编号!⚠️")
elif choice == "5":
# 标记任务完成/未完成
task_number = int(input("请输入要标记的任务编号:"))
if 1 <= task_number <= len(tasks):
# 使用布尔值反转完成状态(True <-> False)
current_status = tasks[task_number - 1][1]
new_status = not current_status
# 使用列表索引更新任务的完成状态
tasks[task_number - 1] = (tasks[task_number - 1][0], new_status)
status = "✅" if new_status else "❌"
print(f"任务 '{tasks[task_number - 1][0]}' 已标记为 {'完成' if new_status else '未完成'} {status}")
else:
print("无效的任务编号!⚠️")
elif choice == "6":
# 退出系统
print("退出系统,谢谢使用!🚀")
break
else:
print("无效选项,请重新选择!❌")
实际上最终待办是一个二维列表,像下面这样
tasks = [["买菜", "已完成 ✅"], ["写作业", "已完成 ✅"], ["运动", "已完成 ✅"]]
在本节中,我们学习了常见的数据类型:列表、元组、字典和集合。
这些都是在编程中常用的数据类型,**掌握他们的区别和作用,以及基本的增、删、改、查操作。**对我们后续去操作数据、格式化数据都非常有帮助。