前两天,我主要在熟悉 Python 里的基础语法,比如运算符、字符串、分支和循环。到了第三天,开始接触几个非常重要的数据结构:
元组、集合、字典。
如果说前两天学的是“程序怎么写”,那今天更像是在学习:
程序里的数据,到底该怎么组织。
这一步其实非常关键。
因为以后无论是写普通 Python 程序,还是做 AI 应用开发,你都会经常和各种数据结构打交道。比如:
接口返回的数据怎么存
文本去重怎么做
用户信息怎么组织
两组数据怎么求交集
键值映射怎么转换
这些背后,都会用到今天学的内容。
一、为什么第三天开始学这些?
因为写程序,归根到底离不开两件事:
前两天我更多是在练逻辑,比如条件判断、循环执行。而今天开始,我接触的是 Python 里最常用的几种数据容器。
它们分别适合不同场景:
元组:适合存一组固定不变的数据
集合:适合做去重、交集、并集这类运算
字典:适合做“键值对应”的数据组织
这些内容一旦掌握好,后面写代码就会更顺。
二、第一题:列表元素去重
今天第一道题,是一个非常典型的集合练习题:
给定一个列表:
li=[1, 1, 2, 3, 4, 7, 8, 2, 1, 2]
要求去除重复元素。
我写的代码是:
li=[1, 1, 2, 3, 4, 7, 8, 2, 1, 2]li=list(set(li))print(li)
输出结果类似:
[1, 2, 3, 4, 7, 8]
这道题最核心的知识点就是:
集合(set)天然具有去重功能
因为集合里的元素不能重复,所以只要把列表转成集合,重复元素就会自动被去掉。然后如果还想再变回列表,就再套一层 list()。
也就是:
list(set(li))
这写法很简洁,也很常用。
三、为什么集合能去重?
因为集合本身的设计规则就是:
也正因为这个特性,集合特别适合做下面这些事情:
所以今天这道去重题,其实是在帮我真正理解:
集合不是“长得像列表的东西”,而是一个有明确用途的数据结构。
它最适合的,就是处理“唯一性”问题。
四、补充一点:去重后顺序可能会变
用 list(set(li)) 这种方式去重,虽然简单,但有一个特点:
去重后元素顺序不一定和原列表一致。
这是因为集合本身是无序的。
所以如果题目只要求“去重”,这样写就完全没问题。但如果题目要求“去重后还保持原顺序”,那就不能只靠集合了。
这一点,也让我对数据结构有了更具体的感受:
选对数据结构,不只是会不会写的问题,而是它的特性是否适合当前场景。
五、第二题:判断两个字符串中相同字符的个数
第二题是这样的:
给定任意两个字符串 s1 和 s2,判断 s1 中的字符在 s2 中存在的个数,要求是:
重复的字符只算 1 个。
比如:
s1 = "aabbcc"s2 = "bcdxyz"
因为两个字符串中共同出现的字符是:
所以结果应该是 2。
一条语句就可以写出来:
print(len(set(s1)&set(s2)))
六、这一题背后其实是在学“集合交集”
这行代码看起来不长,但信息量很大。
先看:
set(s1)
它会把字符串 s1 转成集合,并自动去重。
比如:
set("aabbcc")
得到的是:
{'a','b','c'}
同理:
set("bcdxyz")
得到的是:
{'b','c','d','x','y','z'}
接着:
set(s1) & set(s2)
这里的 & 表示 交集,也就是两个集合中共同拥有的元素。
结果就是:
{'b', 'c'}
最后再用:
len(...)
统计数量,就得到 2。
七、我对集合的理解更清楚了
通过这两道题,我对集合的用途开始有点感觉了。
集合特别适合处理这类问题:
是否重复
是否存在公共元素
去重后的元素有哪些
两组数据的重合部分是什么
以前如果只看概念,可能会觉得集合就是“又一种容器”。但真正写题后会发现:
集合的价值,不在于存数据,而在于处理“关系”。
比如今天这个交集问题,如果不用集合来做,代码就会更绕。但用了集合,逻辑就很直接。
这也是 Python 很舒服的一点:合适的数据结构一用上,很多问题会立刻变得清晰。
八、第三题:将字典中的键和值互换
今天第三题,是字典相关的练习:
比如有一个字典:
d = {"a": 1, "b": 2, "c": 3}
要求把它的键和值互换,变成:
{1: "a", 2: "b", 3: "c"}
代码如下:
d={"a": 1, "b": 2, "c": 3}new_d={v: k for k, v in d.items()}print(new_d)
九、这道题让我开始真正接触字典
字典在 Python 里是一个特别常用的数据结构。
它的特点是:
通过键(key)找到值(value)
也就是说,它不是靠位置取数据,而是靠“名字”取数据。
比如:
用户名对应用户信息
商品编号对应商品详情
字段名对应字段值
配置项对应配置内容
这些场景,字典都非常适合。
而今天这道题,其实是让我练习两件事:
1. 怎么遍历字典
这里用到了:
d.items()
它会把字典里的每一组键值对取出来。
2. 怎么构造新字典
这里用到了字典推导式:
{v: k for k, v in d.items()}
意思就是:
遍历原字典中的每一对 k, v
在新字典中,把 v 放前面当键
把 k 放后面当值
最后就完成了键值互换。
十、这道题也让我意识到一个前提
字典键值互换虽然不难,但有一个前提:
原字典中的 value 必须唯一
因为字典的键不能重复。
比如如果原字典是:
{"a": 1, "b": 1}
那你互换之后就会变成:
{1: "b"}
前面的 "a" 会被覆盖掉。
所以这道题虽然简单,但也让我开始注意到:
写代码时,不只是看“能不能写出来”,还要看数据本身是否满足规则。
这其实就是编程思维慢慢变严谨的过程。
十一、今天的整体收获
今天这三道题做完,我对元组、集合、字典的理解,比单纯看定义清楚多了。
尤其是集合和字典,我感觉已经不再只是“记概念”了,而是真正开始知道它们能拿来干什么。
今天我最大的几个收获是:
1. 集合特别适合去重
像 list(set(li)) 这种写法非常直接。
2. 集合特别适合求公共元素
交集运算一上来,代码一下子就变简洁了。
3. 字典特别适合做映射关系
键和值的对应关系,是很多程序数据组织的核心方式。
4. 数据结构不是背定义,而是看场景
什么时候该用列表,什么时候该用集合,什么时候该用字典,这比死记定义更重要。
十二、作为一个 Java 程序员,我今天的一个明显感受
今天学这些内容时,我有个很明显的感觉:
Python 在处理这类“小而明确”的数据操作时,真的非常轻巧。
比如:
如果放在 Java 里,当然也能做,但 Python 往往几行代码就能把核心逻辑表达清楚。
这对以后做 AI 应用开发会很有帮助。
因为 AI 工程里,除了模型本身,很多时候其实都在做这些事:
处理文本数据
整理结构化结果
对结果做去重
对字段做映射转换
对内容做过滤和聚合
而这些,恰恰都离不开今天学的数据结构。
十三、最后
今天是学习 AI 的第三天。
我开始接触 Python 里的 元组、集合、字典,也做了 3 道很有代表性的练习题:
这些题不难,但它们让我开始真正感受到:
写程序,不只是写逻辑,更是在选择合适的数据结构。
这一步,看起来比前两天更偏“基础”,但我反而觉得,它非常重要。
因为程序越往后写,就越会发现:
很多时候,问题能不能优雅地解决,关键不在于你会不会写很多代码,而在于你有没有用对那个最合适的数据结构。
第三天,继续向前。
如果你也在关注AI,或者你也是传统开发者,也在思考接下来该怎么走,欢迎关注我。接下来,我们一起边学,边做,边进化。