欢迎来到《10天学会Python》第5天!昨天学习了灵活的列表,今天认识两个特色数据结构:元组(Tuple) 和 集合(Set) 。
核心概念
元组:不可变容器
元组是有序且不可变的数据容器,创建后不能修改。适合存储坐标、配置等固定数据,保护数据安全。
python
# 创建元组
coordinates = (10, 20) # 经纬度坐标
colors = ("红", "绿", "蓝") # RGB三原色
single = (100,) # 单元素元组,逗号不能少
重要特性:
- 不可变性:不能修改、添加或删除元素
- 有序性:支持索引和切片访问
- 可哈希性:可作为字典的键
元组解包:可以一次性赋值给多个变量
python
x, y = coordinates # x=10, y=20
集合:唯一性容器
集合是无序且元素唯一的容器,自动去重,查找速度快。适合去重、快速查找场景。
python
# 创建集合
lottery_numbers = {3, 7, 12, 22, 30} # 彩票号码
vowels = set("aeiou") # 元音字母集合
重要特性:
- 唯一性:自动去除重复元素
- 无序性:元素无固定顺序,不能索引访问
- 高效性:查找元素速度快
创建方法
元组创建
- 直接创建:
dimensions = (1920, 1080)(最常用) - tuple()转换:
tuple("Hello")→('H','e','l','l','o') - 省略括号:
point = 10, 20(逗号是关键)
集合创建
- 直接创建:
primes = {2, 3, 5, 7}(大括号) - set()转换:
set("banana")→{'b','a','n'}(自动去重) - 集合推导式:
{x for x in range(1,21) if x%3==0}→{3,6,9,12,15,18}
代码示例(5个生活场景)
示例1:地理坐标系统
python
beijing = (39.9042, 116.4074) # 北京经纬度
lat, lon = beijing # 元组解包
print(f"北京纬度:{lat},经度:{lon}")
# beijing[0] = 40.0 # 会报错!元组不可修改
示例2:一周日程安排
python
week_schedule = ("周一会议", "周二开发", "周三学习", "周四合作", "周五总结", "周六休息", "周日家庭")
workdays = week_schedule[:5] # 切片获取工作日
for day in workdays:
print(day)
示例3:朋友圈点赞统计
python
likes = ["小明", "小红", "小刚", "小明", "小红", "小丽"]
unique_likers = set(likes) # 自动去重
print(f"唯一点赞{len(unique_likers)}人:{unique_likers}")
示例4:购物清单去重
python
raw_list = ["牛奶", "面包", "鸡蛋", "牛奶", "苹果", "面包"]
unique_items = set(raw_list) # 去重
print(f"去重后清单:{list(unique_items)}")
示例5:兴趣交集匹配
python
alice = {"读书", "旅行", "摄影", "美食"}
bob = {"游戏", "摄影", "美食", "运动"}
common = alice & bob # 交集:共同爱好
all_hobbies = alice | bob # 并集:所有爱好
print(f"共同爱好:{common},所有爱好:{all_hobbies}")
对比讲解:列表 vs 元组 vs 集合
| 特性 | 列表(List) | 元组(Tuple) | 集合(Set) |
|---|---|---|---|
| 可变性 | ✅ 可变 | ❌ 不可变 | ✅ 可变 |
| 有序性 | ✅ 有序 | ✅ 有序 | ❌ 无序 |
| 元素唯一性 | ❌ 允许重复 | ❌ 允许重复 | ✅ 唯一 |
选择指南:
- 列表:需要频繁增删改查的数据集合
- 元组:需要保护数据不被修改(如配置、坐标)
- 集合:需要快速查找或去重(如用户ID、关键词)
实践应用:智能通讯录系统
python
contacts = [("张三", "13800138000"), ("李四", "13900139000")]
tags = {"同事", "朋友", "家人"}
def find_contact(name):
for contact in contacts:
if contact[0] == name:
return contact
return None
contact = find_contact("张三")
if contact:
print(f"找到:{contact[0]},电话:{contact[1]}")
练习题
练习1:基础操作
- 创建元组
student = ("小明", 18, "计算机"),分别用索引和解包两种方式获取年龄 - 创建集合
numbers = {1, 3, 5, 7, 9},添加偶数{2, 4, 6, 8}后删除数字5 - 检查元组
colors = ("红", "绿", "蓝")是否包含"黄色"
练习2:数据处理
给定列表 scores = [85, 92, 78, 85, 90, 92, 78, 85]:
- 转换为集合,统计不同分数数量
- 找出最高分和最低分
- 合并新分数
[88, 92, 95]并去重
练习3:集合运算实战
有两个班级的学生名单:
python
class_a = {"小明", "小红", "小刚", "小丽"}
class_b = {"小强", "小红", "小华", "小丽"}
计算:
- 两个班级共有哪些学生?
- 只在A班不在B班的学生?
- 两个班级所有不重复的学生总数?
总结
元组保护数据安全,集合提高处理效率。根据需求选择合适的数据结构。
明天学习强大的字典(Dict)!
学习建议:多动手练习,理解不同数据结构的适用场景。