当前位置:首页>python>新手学Python总搞混列表和字典?看完这篇直接搞懂!

新手学Python总搞混列表和字典?看完这篇直接搞懂!

  • 2026-10-10 04:35:56
新手学Python总搞混列表和字典?看完这篇直接搞懂!
原来这么多人都搞不清列表和字典啊

我之前遇到过一个刚学Python的小孩,对着代码盯了快一小时,一会儿说把数据放列表里不对,一会儿说字典索引怎么都拿不出来,急得满头汗。

其实不止新手,好多学了小半年的人,碰到稍微复杂点的数据结构,还是会下意识用错列表和字典。这俩太基础了,基础到好多教程随便讲两句就让你自己悟,越悟越糊涂。

你说列表不就是存一堆数吗?字典不就是存键值对吗?话是这么说,但真到写项目的时候,什么时候用列表什么时候用字典,90%的人第一反应都是瞎选。

我有个朋友做数据爬虫,爬下来一堆用户信息,一股脑全塞列表里,结果要找某个用户ID的信息,硬生生循环了十遍才找出来,运行速度慢到被老板骂。要是当初直接把ID当键存字典里,一句话就能拿出来,哪来这么多破事。

先搞懂列表到底是个什么东西

说回最基础的,列表到底是什么?

你就把它当成一排抽屉,每个抽屉都按顺序编好了号,从0开始数,第一个抽屉编号0,第二个1,往后顺着排就行。你要放什么东西都行,放整数,放字符串,放另一个列表,甚至把字典放进去都没人管你。

列表最大的特点就是有序,而且可以改。这个有序真的太重要了,你放进去的顺序是什么,取出来就是什么,不会乱变。而且你想删哪个改哪个都随便,没人拦着你。

怎么创建一个列表太简单了,一对中括号往里填东西就行,比如my_list = ["苹果", "香蕉", "橙子"],这就是最标准的列表。

取元素的时候,直接按编号拿啊,my_list[0]出来就是苹果,my_list[2]就是橙子,就这么简单。那我想在中间加个新水果怎么办?直接用insert方法,my_list.insert(1, "葡萄"),原来编号1的香蕉就往后挪了一位,葡萄直接站进1号位,完美。

我个人觉得,列表最适合存什么?存一堆顺序很重要,而且需要按位置拿出来的东西。比如你存一个班级的学生点名册,按学号排好顺序,点到第几个直接拿第几个,太方便了。或者你爬网页,存一堆同类型的链接,挨个下载,用列表也刚好。

但列表有个特别坑的地方,很多新手都踩过。你要是想找列表里某个特定的元素,不知道它在哪,你就得从头一个个遍历,数据少还好说,数据多了真的慢到离谱。

比如你列表里存了一万个用户信息,你想找ID是10086的那个,你就得从第一个开始比,比到一万次才找得到,这效率谁受得了啊?

这个时候字典的优势就出来了。

字典才是真正的"按名找货"神器

字典跟列表完全不是一个思路,字典不按编号排队,它给每个存进去的东西都起个名字,你要拿的时候直接喊名字就行,不用挨个找。

就像你去书店查书,书名就是键,书本身就是值,你直接查书名,一秒就能找到在哪,根本不用从第一排书架开始挨个翻。

创建字典也简单,一对大括号,键和值用冒号分开,不同的键值对用逗号隔开,比如user_info = {"name": "张三", "age": 25, "id": 10086},这里name、age、id就是键,对应引号里或者数字就是对应的值。

拿值的时候更简单,直接放中括号里写键就行,user_info["name"]直接就出来张三了,根本不用记编号,也不用挨个找,这速度比列表快了不知道多少倍。

而且字典的键必须是不能变的类型,你用字符串、数字、元组当键都可以,你不能用列表当键,因为列表是可以改的,字典不认可变的东西当键。这个点一定要记好,好多新手跑报错都是因为键用了列表。

字典也能改啊,你想加个新的键值对,直接写user_info["gender"] = "男",直接就加上了,原来没有的话就新增,原来有的话就覆盖,用着特别顺手。

我记得之前看到过一个数据,说Python里八成的数据处理场景,其实用字典比用列表更方便。我觉得这话真不假,尤其是处理带标签的数据,每个数据都有自己的标识,直接把标识当键存字典,什么时候用什么时候拿,太省心了。

列表和字典最容易搞混的几个场景

说了这么多,到底什么时候用列表,什么时候用字典?给你举几个实际的例子,看完你就不会错了。

比如你要存一周的天气温度,周一到周日按顺序排,你要每天按顺序打印出来,这种肯定用列表啊。temp = [23, 25, 22, 26, 24, 25, 21],周一就是第一个,周日就是最后一个,拿的时候按索引取,完美。

那如果我要存每个人对应的体温呢?张三今天多少度,李四今天多少度,这种你用列表就傻了,你得存成[("张三", 36.5), ("李四", 36.7)],找的时候还要循环对比名字,直接整个字典{"张三":36.5, "李四":36.7},要拿张三的温度直接写名字就出来,不好吗?

还有嵌套的情况,很多人碰到嵌套就懵,其实一点都不难。比如我要存一个班级所有学生的信息,每个学生有姓名年龄学号,那你外面可以用列表,因为你要按顺序存所有学生,里面每个学生的信息用字典,这不就清晰了吗?

class_student = [     {"name": "张三", "age": 18, "id": 1},     {"name": "李四", "age": 19, "id": 2} ] 

你看,遍历所有学生直接循环列表就行,找每个学生的信息直接用键拿,一点不乱。

反过来有没有外面用字典里面用列表的?太有了。比如你要按班级存学生名单,一年级有哪些学生,二年级有哪些学生,那直接把年级当键,值是存学生名字的列表,{"一年级": ["张三", "李四"], "二年级": ["王五", "赵六"]},找一年级所有学生直接拿键出来就是列表,挨个遍历就行,太舒服了。

我之前帮人改代码,见过有人把这种结构全塞列表里,[["一年级", "张三", "李四"], ["二年级", "王五", "赵六"]],找二年级的学生得从头找,累不累啊,这就是典型的用错了数据类型。

那些你没注意过的实用小技巧

讲点日常用得到,但是好多人不知道的小操作,真的能省很多时间。

列表你要删除元素,除了按索引删,还能直接按值删,就是用remove方法,比如my_list.remove("香蕉"),直接就把第一个叫香蕉的元素删掉了,不用你自己找索引。不过要注意,如果有多个相同的值,只会删第一个,别搞错了。

字典你要拿键的时候,怕键不存在报错怎么办?直接用get方法啊,user_info.get("phone", "未填写"),如果有phone这个键就返回对应的值,没有就返回你给的默认值,比你直接写user_info["phone"]靠谱多了,不会随便报错崩程序。

还有那个合并列表和合并字典,好多人都用循环加进去,其实没必要。两个列表合并直接相加就行,list1 + list2直接就出来新的合并好的列表,多简单。

两个字典合并,现在Python3.9之后直接用竖线就行,dict1 | dict2,直接合并,有相同的键以后面的为准,太方便了。老版本的话用update方法也行,就是稍微麻烦一点,但也比循环快。

还有一个点特别重要,千万不要一边循环列表一边删除列表的元素,我见过太多人踩这个坑了。你删了元素之后,列表的长度变了,索引也跟着变,循环着就会跳着漏掉元素,结果怎么跑都不对。正确的做法是先把要保留的元素挑出来存个新列表,原来的直接扔了就行,别瞎改原来的。

字典也有坑,就是你不能在循环字典的时候同时删字典的键,跟列表一个道理,会报错。想删的话,先把要删的键存进一个列表,然后循环列表去删字典里的键,就不会出问题了。

其实真的没有那么难

说了这么多,你回头看,列表和字典难吗?真不难,核心就是搞清楚两者的设计思路不一样。

列表是给你按顺序排队,按位置拿,适合存同类型有序序列。字典是给你按名字找,按键拿,适合存带标识的结构化数据。

别死记硬背那些定义,多写两次,碰到错了多想想为什么错,下次就不会错了。好多人学了半天还是搞混,就是因为不动手,光看教程说的,真到自己写就懵。

这个问题我其实也没什么更厉害的总结了,记住核心思路,多用就熟了。要是你还是分不清楚,下次写代码之前先问自己一句:我是要按顺序找,还是要按名字找?想清楚这个,就不会选错了。

最新文章

随机文章