Python列表与元组:数据存储的艺术
前言:
在我们的编程过程中,需要许多变量来保存或者表示数据
如果代码中需要表示的数据个数比较少, 我们直接创建多个变量即可.
num1 = 1 num2 = 1 num3 = 1
但是我们在完成项目时,肯定会遇到很多很多的变量来完成整个项目,这时候就要用到列表
一、列表和元组的概念
1.1 列表
- 定义:有序、可变的元素集合. 是一种可以让程序员在代码中批量表示/保存数据
- 表示方式:方括号
[]
表示大家可以想象一下,一个宿舍四个人 ,你们决定列一个宿舍公约,比如:
- 每天轮流打扫卫生
- 晚上11点后睡觉,不睡的戴上耳机
- 每月组织一次聚餐
其实这个公约就像Python里的列表,我们可以这么表示
roommate_rules = ['轮流打扫','11点熄灯戴耳机','每月聚餐']
根据定义我们知道,列表是可以改变的,就例如我们的宿舍公约执行了一段时间觉得并不是特别完善需要修改一下,或者有新成员的加入,这个时候我们就可以修改或者增加几条规则:
#创建链表
#这里的.append remove 链表+[3]的只是后面会提到,这里只是展示可修改这一特性
roommate_rules = ['轮流打扫','11点熄灯戴耳机','每月聚餐','冰箱食物贴名字']
roommate_rules.append = ['新室友打扫一周']#增加一条规则
roommate_rules[3] = '每两个月聚一次餐'#修改一条规则
roommate_rules.remove('冰箱食物贴名字')#删除一条规则
1.2 元组
- 定义:固定,不可变的数组集合
- 表示方式:括号 () 表示
ps:就算只有一个元素,也要使用逗号,不然Python会把他当做一个普通变量
single_tuple(5,) #error not_tuple(5)
现在我们来看看另一个场景
你们四个人决定去旅游,定好了明天上午九点的高铁票.这个时候车票会有四个无法修改的信息:出发时间/目的地/座位号/乘客姓名
这就像我们Python里的元组:
tran_ticket = ("2025-8-16 09:00", "台州","3车14A","秃然醒悟")
元组的特点是 :固定不可变
就像我们的车票信息,一旦买好了就不能随意修改了.你不能把九点的车票改成十点(除非退了重买),也不能把车座信息(除非升座)
但你一定要修改元组的信息,就会报错
tran_ticket[0] = ("2025-8-16 10:00")
1.3 列表和元组小总结
- 列表就像你们代办的清单,可以随时添加,修改,删除.
- 元组就像你们的身份信息,一旦确定就无法随意修改
但是我们会想,什么时候用列表又什么时候用元组呢?
- 如果数据可能改变,例如:学生成绩,购物清单等,就用列表
- 如果数据是固定的,比如地理经纬度信息,日期时间等,就用元组
- 总而言之,使用两者的决定性因素其实就是信息是否能够被修改
记住这一个小口诀:
"列表可变用方括,元祖固定用园括"
二 、访问下标
- 我们可以通过访问操作符[ ]来获取列表和元组中的任意元素
我们把[ ]中的数字称为下标或者索引
alist = [1,2,3,4,5] btuplet = (6,7,8,9,0)
当我们想访问他们的元素:这就像你想去图书馆找书,书是你要访问的元素,而图书编号就是帮助你找到真本书的下标
在Python中,无论是列表还是元组,它们里面的每个元素都有一个"门牌号",他们叫下标
这个下标是从0开始,并不是从1开始哦
2.1 例子说明
#定义一个列表和一个元组
a_list =["苹果","香蕉","橙子","葡萄"]
a_tuple =("红","黄","橙","紫")
#下标示意图
#列表 a_list =["苹果","香蕉","橙子","葡萄"]
#下标位置 0 1 2 3
#元组 a_tuple =("红","黄","橙","紫")
#下标位置 0 1 2 3
大家可以看到元素与下表的对应
2.2 如何访问
使用[ ]
2.2.1 正向
从前往后(0开始)
#正向索引
print(a_list[0])
print(a_list[1])
print(a_tuple[2])
2.2.2 反向
下标还可以表示负数,表示"倒数第几个元素"
a_list(-1)等价于 a_list(len(a_list)-1)
从后往前(-1开始)
#正向索引
print(a_list[-1])
print(a_list[-1])
print(a_tuple[-2])
2.3 索引越界
如果你要找的"门牌号"不存在,那么Python就会报错
#索引越界
#假定你只有3个元素,但是你想访问不存在的第四个元素
Alist = [1,2,3]
print(Alist[5])#访问第四个元素
这个时候你运行一下,就会报错
2.4 通过下标修改元素的值
我们不光可以用下标来访问列表或者元素的值,也可以修改
#通过下标修改元素的值
Blist = [1,2,3,4]
Btuple = [5,6,7,8]
Blist[1] = 3#将列表的第二个元素的值修改成3
Btuple[1] = 3#将元组的第二个元素的值修改成3
print(Blist)
print(Btuple)
三 、切片
通过下标操作是一次取出里面第一个元素
通过切片,则是一次性取出一组元素,相当于得到了一个子列表和子元组
什么是切片?
想象一下你有一块披萨,被切成了八块,你只想吃其中的三块(第三块到第五块).切片就是用来"切出"数据中某一段连续元素的技术.
3.1基本语法
- 使用[ : ]的方式进行切片操作
sequence[stars:end:step]
- start:从哪里开始(包含)
- end:到哪里结束(不包含!这里是重点!)
- step:步长,每次跳几个下标(可选,默认是1)
alist = [1,2,3,4,5,6,7,8]#八片披萨
print(alist[3:7])#取其中的三片,3~5
ps:
alist [3: 6] 中的 3:6 表示的是[3 , 7)这样的由下标构成的前闭后开区间
也就是下表为3的元素开始(4),到下标 7(6),但不包含下标7的元素
3.2 切片三要素详解
让我们用一个例子来引入
#切片
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]#列表
digits = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]#元组
3.2.1 基本切片
print(numbers[2:5])#输出3~4(不包5)
print(digits[3:6])#输出4~5
3.2.2 省略起点或终点
print(numbers[:3])#从开头到第三个(不包含)1~3
print(numbers[5:])#五个到最后[6,7,8,9,10]
3.2.3 使用步长 stpe
print(numbers[::2])#每隔一个取一个 [1, 3, 5, 7, 9]
print(numbers[::-1])#从最后开始往前去 [10, 9, 8, 7, 6, 5, 4, 3, 2, 1]
print(numbers[1::2])#从第一个开始,每隔一个 [2, 4, 6, 8, 10]
3.3 常见陷阱问题
- 左闭右开原则: [ 2: 5 ]包含2,不包含5!
- 越界不会报错: 切片越界不会像索引那样报错,而是自动处理:
numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]#列表 print(numbers[2:200])
- 步长不能为0:[ : : 0]会报错
四、遍历列表/元组
4.1 什么是遍历
"遍历"指的就是把元素一个一个取出来,再分别处理
无论是列表还是元组,遍历的方法都是相同的
假如你们班主任要检查每个人的作业.他有两种方式
- 一个个点名
- 对全班说:"所有人把作业交上来".
在编程过程中,我们把第二个方式称为遍历
4.2 for循环遍历
#遍历
fruits = ['apple', 'banana', 'orange', 'strawberry']
colors = ['red', 'green', 'blue', 'yellow']
for fruit in fruits:print(f"fruit: {fruit}")
for color in colors:print(f"color: {color}")
4.3 配合 range() 和len() (需要索引时)
#遍历
fruits = ['apple', 'banana', 'orange', 'strawberry']
colors = ['red', 'green', 'blue', 'yellow']
for i in range(len(fruits)):print(fruits[i])print(colors[i])
4.4 使用while循环,手动控制下表变化
alist = [1,2,3,4,5]
i = 0
while i < len(alist):print(alist[i])i = i + 1
五、新增元素
5.1 使用 append
- 使用 append 方法,向列表或元素末尾插入一个元素(尾插)
shopping = ["egg", "ham", "spam"]
shopping.append("milk")
print(shopping)
shopping.append("apple")
print(shopping)
5.2 使用insert()
- 使用inster 方法,在任意位置插入元素
如果你有急事要插队,就是用insert
list.insert(索引,元素)
#insert
shopping = ["egg", "ham", "spam"]
shopping.insert(1,"milk")
print(shopping)
5.3 extend() 或 + = 添加多个元素
当你有一堆东西要加时,用extend(),它可以把另一个列表"展开"后加进来
#方法一:extend()
shopping = ["egg", "ham", "spam"]
more_items = ["咖啡","糖","奶油"]
shopping.extend(more_items)
print(shopping)#方法二:操作符
shopping += ["咖啡","糖","奶油"]
print(shopping)
六、 查找元素
- 使用 in 操作符,判定元素是否在列表中存在.返回值是布尔类型
#查找元素
alist = [1,2,3,4,5]
print(2 in alist)
print(3 in alist)
当元素存在返回True,不存在返回False
七、删除元素
7.1 pop
- 使用pop方法删除最末尾元素
alist = [1,2,3,4]
alist.pop(2)
print(alist)
这时我们会发现,3被删了
7.2 remove
- 使用remove的方法,按照值删除元素
alist = [1,2,3,4]alist.remove(3)
print(alist)
八、总结
8.1 核心对比表
特性 | 列表(List) | 元组(Tuple) |
---|---|---|
语法 | 方括号 [] | 小括号 () |
可变性 | ✅ 可变(Mutable) | ❌ 不可变(Immutable) |
新增元素 | ✅ 支持 append , insert , extend | ❌ 不支持(只能创建新元组) |
修改元素 | ✅ 可以 list[0] = x | ❌ 报错 |
删除元素 | ✅ 支持 remove , pop | ❌ 不支持 |
遍历 | ✅ 支持 | ✅ 支持 |
切片 | ✅ 支持 | ✅ 支持 |
索引访问 | ✅ 支持 | ✅ 支持 |
存储效率 | 稍低 | 稍高(更节省内存) |
性能 | 稍慢 | 稍快(适合大量读取) |
8.2 使用场景推荐
对于这两者而言,最本质区别就是可修改和不可修改,我们紧紧围绕这一点进行分析就行:
场景 | 推荐类型 | 例子 |
---|---|---|
数据会变 | ✅ 列表 | 购物清单、学生成绩、日志记录 |
数据固定 | ✅ 元组 | 坐标点 (x,y) 、RGB颜色 (255,128,64) 、一周七天名称 |
作为字典的键 | ✅ 元组 | dict[(0,0)] = "起点" (列表不能做字典的键!) |
函数返回多个值 | ✅ 元组 | return ("用户名", 25, "男") |
需要高性能读取 | ✅ 元组 | 大量只读数据,如配置项 |
这里的列表为下一篇博客的内容,大家目前了解一下就好
下一篇博客我们将进入Python的另一个重要数据类型——字典(Dictionary),它就像一本“键值词典”,能让你通过“关键词”快速找到“解释”。