跳到主要内容
Python 常用数据结构之元组详解 | 极客日志
Python 算法
Python 常用数据结构之元组详解 综述由AI生成 Python 元组是不可变序列类型,用于存储有序数据。相比列表,元组一旦创建无法修改元素,适合多线程环境且创建效率更高。元组的定义语法、索引切片、拼接成员运算、打包解包操作及变量交换技巧,探讨了元组作为字典键和函数返回值的应用场景,并通过 timeit 模块对比了元组与列表的创建性能差异,最后总结了两者在可变性及适用场景上的区别。
ArchDesign 发布于 2025/2/6 更新于 2026/5/23 14 浏览Python 常用数据结构之元组详解
在 Python 中,列表是一种常用的容器型数据类型,用于保存多个数据并通过循环实现批量操作。除了列表之外,Python 还提供另一种重要的容器型数据类型——元组(tuple)。元组与列表类似,都是有序序列,但在可变性上存在本质区别。
元组的定义和运算
在 Python 中,元组是由多个元素按照一定顺序构成的序列。元组是不可变类型 ,这意味着一旦定义,其中的元素不能添加、删除或修改。如果试图修改元组中的元素,将引发 TypeError 错误。
1. 定义语法
定义元组通常使用形如 (x, y, z) 的字面量语法。元组支持的运算符与列表基本一致。
t1 = (35 , 12 , 98 )
t2 = ('骆昊' , 43 , True , '四川成都' )
print (type (t1))
print (type (t2))
print (len (t1))
print (len (t2))
2. 索引与切片
元组支持索引运算和切片运算,用法与列表相同。
print (t1[0 ])
print (t1[2 ])
print (t2[-1 ])
print (t2[:2 ])
print (t2[::3 ])
3. 遍历与成员运算 可以通过循环遍历元组中的元素,也可以使用 in 和 not in 进行成员判断。
for elem in t1:
print (elem)
print (12 in t1)
print (99 in t1)
print ('Hao' not in t2)
4. 拼接与比较运算 元组支持拼接运算(+)和比较运算(==, >=, <= 等)。
t3 = t1 + t2
print (t3)
print (t1 == t3)
print (t1 >= t3)
print (t1 <= (35 , 11 , 99 ))
5. 特殊定义注意事项
空元组:() 表示空元组。
一元组:如果元组中只有一个元素,必须加上逗号,否则 () 仅作为改变运算优先级的圆括号。
('hello', ) 和 (100, ) 是一元组。
('hello') 和 (100) 只是字符串和整数。
a = ()
print (type (a))
b = ('hello' )
print (type (b))
c = (100 )
print (type (c))
d = ('hello' , )
print (type (d))
e = (100 , )
print (type (e))
打包和解包操作
1. 打包操作 当把多个用逗号分隔的值赋给一个变量时,多个值会自动打包成一个元组。
a = 1 , 10 , 100
print (type (a))
print (a)
2. 解包操作 将一个元组赋值给多个变量时,元组会解包成多个值分别赋给对应的变量。如果元素个数与变量个数不对应,会引发 ValueError 异常。
i, j, k = a
print (i, j, k)
3. 星号表达式 为了解决变量个数少于元素个数的问题,可以使用星号表达式(*)。被星号修饰的变量会接收剩余的所有值并转换为列表。注意,星号表达式在解包语法中只能出现一次。
a = 1 , 10 , 100 , 1000
i, j, *k = a
print (i, j, k)
i, *j, k = a
print (i, j, k)
*i, j, k = a
print (i, j, k)
解包语法适用于所有序列,包括列表、range 对象甚至字符串。
a, b, *c = range (1 , 10 )
print (a, b, c)
a, b, c = [1 , 10 , 100 ]
print (a, b, c)
a, *b, c = 'hello'
print (a, b, c)
交换变量的值 在 Python 中,交换两个或多个变量的值非常便捷,无需中间变量。
a, b = b, a
a, b, c = b, c, a
底层机制涉及打包和解包,对于多于三个变量的互换,需要通过打包解包方式完成。
元组和列表的比较
1. 为什么需要元组?
不可变性 :元组是不可变类型,适合多线程环境,降低了并发访问的同步开销。
性能优势 :创建元组通常比创建列表更快,且占用内存更少。
语义明确 :当数据不应被修改时,使用元组能向其他开发者传达'只读'的意图。
2. 性能对比 使用 timeit 模块可以测试创建相同元素数量的列表和元组的时间差异。
import timeit
print ('%.3f 秒' % timeit.timeit('[1, 2, 3, 4, 5, 6, 7, 8, 9]' , number=10000000 ))
print ('%.3f 秒' % timeit.timeit('(1, 2, 3, 4, 5, 6, 7, 8, 9)' , number=10000000 ))
3. 相互转换 infos = ('骆昊' , 43 , True , '四川成都' )
print (list (infos))
frts = ['apple' , 'banana' , 'orange' ]
print (tuple (frts))
元组的典型应用场景
1. 作为字典的键 由于元组是不可变的,它可以作为字典的键(Key),而列表因为可变不能作为键。
scores = {
('Alice' , 'Math' ): 95 ,
('Bob' , 'Math' ): 88 ,
}
print (scores[('Alice' , 'Math' )])
2. 函数返回多个值 Python 函数默认返回单个值,但通过元组打包,可以方便地返回多个结果。
def get_min_max (numbers ):
return min (numbers), max (numbers)
result = get_min_max([1 , 5 , 3 , 9 , 2 ])
print (result)
总结 列表和元组都是容器型的数据类型 ,即一个变量可以保存多个数据,而且它们都是按一定顺序组织元素的有序容器。
列表是可变数据类型 ,支持添加、删除、排序等操作。
元组是不可变数据类型 ,一旦创建无法修改,更适合存储固定配置或多线程共享数据。
两者都支持拼接运算 、成员运算 、索引运算 、切片运算 等操作。
推荐使用列表生成式语法创建列表,效率高且代码简洁。
在实际开发中,如果数据不需要修改,优先使用元组可以提高程序的安全性和运行效率;如果需要频繁修改数据集合,则使用列表。
相关免费在线工具 加密/解密文本 使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
Gemini 图片去水印 基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
curl 转代码 解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
Base64 字符串编码/解码 将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
Base64 文件转换器 将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
Markdown转HTML 将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online