第四章 · 数据结构

元组与集合

本节目标

学完这一节,你会知道:

  1. 元组和列表有什么区别
  2. 如何使用元组保存不想被修改的数据
  3. 什么是元组解包
  4. 集合如何自动去重
  5. 如何用集合做交集、并集和差集分析

元组和集合都不是列表的替代品,而是在特定场景下更合适的工具。

先跑一个例子

新建文件 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 把两个值分别拆给 xy

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}")

然后继续改:

  1. 输出只报名 A 课程的人
  2. 输出只报名其中一门课的人
  3. 增加一个新学生到 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),把它解包成 xy,然后输出。

练习 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}")

小结

这一节你学会了:

  1. 元组是有序但不可修改的数据
  2. 单元素元组要写逗号
  3. 元组解包可以一次拿到多个值
  4. 集合会自动去重,但没有固定顺序
  5. 集合适合做交集、并集、差集分析

下一节我们会学习字典。字典用键值对保存数据,是 Python 里最核心的数据结构之一。

元组负责稳住,集合负责去重

元组像写好后不想被乱改的便签,集合像自动清理重复项的小筛子。把坐标、标签、报名名单这些例子跑一跑,你会发现它们不是列表的替身,而是各有脾气的好工具。

讨论 (0)

还没有评论,来抢沙发吧!