元组与集合
本节目标
学完这一节,你会知道:
- 元组和列表有什么区别
- 如何使用元组保存不想被修改的数据
- 什么是元组解包
- 集合如何自动去重
- 如何用集合做交集、并集和差集分析
元组和集合都不是列表的替代品,而是在特定场景下更合适的工具。
先跑一个例子
新建文件 tuple_set_demo.py,写入:
point = (10, 20)
x, y = point
tags = ["Python", "入门", "Python", "基础", "入门"]
unique_tags = set(tags)
print(f"坐标 x={x}, y={y}")
print(f"原始标签:{tags}")
print(f"去重标签:{unique_tags}")
运行:
python3 tuple_set_demo.py
你会看到元组解包和集合去重的效果。
元组:不能修改的序列
元组和列表很像,也有顺序,也能用索引。
point = (10, 20)
rgb = (255, 128, 0)
print(point[0])
print(rgb[2])
但元组创建后不能修改:
point[0] = 99
这会报 TypeError。
什么时候用元组?
- 坐标:
(x, y) - 颜色:
(255, 128, 0) - 不希望被修改的固定数据
- 函数返回多个值
创建元组
t1 = (1, 2, 3)
t2 = 1, 2, 3
empty = ()
只有一个元素的元组要加逗号:
one = (42,)
not_tuple = (42)
print(type(one))
print(type(not_tuple))
(42) 只是普通括号里的整数。
元组解包
解包就是把元组里的值一次性赋给多个变量。
user = ("小明", 18, "成都")
name, age, city = user
print(name)
print(age)
print(city)
交换两个变量:
a = 10
b = 20
a, b = b, a
print(a, b)
用 * 收集剩余元素:
numbers = (1, 2, 3, 4, 5)
first, *middle, last = numbers
print(first)
print(middle)
print(last)
注意:middle 会是列表。
集合:不重复的数据
集合最大的特点:不重复。
numbers = [1, 2, 2, 3, 3, 3]
unique_numbers = set(numbers)
print(unique_numbers)
输出类似:
{1, 2, 3}
集合还有一个特点:无序。所以不要依赖集合里的显示顺序。
创建空集合要用:
empty_set = set()
{} 是空字典,不是空集合。
集合增删
fruits = {"苹果", "香蕉"}
fruits.add("橙子")
fruits.update(["葡萄", "西瓜"])
print(fruits)
删除:
fruits.remove("苹果")
fruits.discard("不存在的水果")
remove() 删除不存在的元素会报错,discard() 不会。
集合运算
集合很适合做“哪些共同拥有”“哪些只在一边”的分析。
python_students = {"小明", "小红", "小刚"}
java_students = {"小红", "小美", "小刚"}
交集:两边都有
print(python_students & java_students)
并集:所有人
print(python_students | java_students)
差集:只在左边
print(python_students - java_students)
对称差集:只学其中一门的人
print(python_students ^ java_students)
逐行拆解
再看开头的例子:
point = (10, 20)
x, y = point
point 是元组,x, y = point 把两个值分别拆给 x 和 y。
unique_tags = set(tags)
把列表转成集合,重复标签会自动合并。
自己改一改
把 tuple_set_demo.py 改成:
student = ("小明", 18, "成都")
name, age, city = student
course_a = {"小明", "小红", "小刚"}
course_b = {"小红", "小美", "小刚"}
print(f"{name} 来自 {city}")
print(f"两门课都报名的人:{course_a & course_b}")
print(f"所有报名的人:{course_a | course_b}")
然后继续改:
- 输出只报名 A 课程的人
- 输出只报名其中一门课的人
- 增加一个新学生到
course_a
常见错误
1. 单元素元组忘记逗号
one = (1)
print(type(one))
这是整数。正确写法:
one = (1,)
2. 修改元组
point = (10, 20)
point[0] = 99
元组不能修改。如果数据需要频繁修改,用列表。
3. 以为集合有固定顺序
集合是无序的。打印出来的顺序不适合作为业务逻辑依据。
4. 创建空集合写成 {}
empty = {}
这是空字典。空集合要写:
empty = set()
小练习
练习 1:坐标解包
创建元组 point = (3, 5),把它解包成 x 和 y,然后输出。
练习 2:标签去重
给定:
tags = ["python", "flask", "python", "web", "flask"]
去重后输出集合。
练习 3:共同好友
给定两个好友集合,找出共同好友和只在第一个集合里的好友。
参考答案
练习 1:
point = (3, 5)
x, y = point
print(f"x={x}, y={y}")
练习 2:
tags = ["python", "flask", "python", "web", "flask"]
unique_tags = set(tags)
print(unique_tags)
练习 3:
friends_a = {"小明", "小红", "小刚"}
friends_b = {"小红", "小美", "小刚"}
print(f"共同好友:{friends_a & friends_b}")
print(f"只在 A 里的好友:{friends_a - friends_b}")
小结
这一节你学会了:
- 元组是有序但不可修改的数据
- 单元素元组要写逗号
- 元组解包可以一次拿到多个值
- 集合会自动去重,但没有固定顺序
- 集合适合做交集、并集、差集分析
下一节我们会学习字典。字典用键值对保存数据,是 Python 里最核心的数据结构之一。
元组负责稳住,集合负责去重
元组像写好后不想被乱改的便签,集合像自动清理重复项的小筛子。把坐标、标签、报名名单这些例子跑一跑,你会发现它们不是列表的替身,而是各有脾气的好工具。
还没有评论,来抢沙发吧!