常用数据结构之元组
元组 vs 列表
元组和列表一样用于存储多个元素,核心区别在于:列表可变,元组不可变。
| 特性 | 列表 | 元组 |
|---|---|---|
| 可变性 | 可修改 | 不可修改 |
| 语法 | [1, 2, 3] |
(1, 2, 3) |
| 创建速度 | 慢 | 快(约10倍) |
| 适用场景 | 需要频繁增删 | 数据不需要修改 |
创建元组
t1 = (35, 12, 98) # 四元组
t2 = ('骆昊', 45, True, '成都')
# 空元组
a = ()
# 一元组(必须加逗号)
b = ('hello',) # 正确
c = ('hello') # 错!这是字符串
元组运算
元组支持索引、切片、拼接、成员运算——与列表完全相同:
t = (35, 12, 98, 45)
print(t[0]) # 35
print(t[-1]) # 98
print(t[1:3]) # (12, 98)
print(len(t)) # 4
print(12 in t) # True
print(t + (1, 2)) # (35, 12, 98, 45, 1, 2)
打包与解包
打包:多个值赋给一个变量,自动组成元组:
a = 1, 10, 100 # 打包成元组 (1, 10, 100)
解包:元组赋值给多个变量:
t = (1, 10, 100)
i, j, k = t # i=1, j=10, k=100
星号表达式(接收剩余元素为列表):
a, b, *c = (1, 10, 100, 1000)
print(a, b, c) # 1 10 [100, 1000]
*i, j = (1, 10, 100, 1000)
print(i, j) # [1, 10, 100] 1000
注意:星号表达式只能出现一次。
交换变量
Python 独有语法,无需临时变量:
a, b = b, a # 交换a和b
a, b, c = b, c, a # 循环交换三个变量
列表与元组转换
infos = ('骆昊', 45, True)
print(list(infos)) # 元组→列表
frts = ['apple', 'banana']
print(tuple(frts)) # 列表→元组
为什么需要元组
- 性能:创建元组比列表快约10倍,适合存储常量数据
- 线程安全:不可变类型天然适合多线程环境
- 可作为字典键:元组可哈希,列表不行
# 性能对比
import timeit
print(timeit.timeit('[1,2,3,4,5]', number=10000000)) # ~0.6秒
print(timeit.timeit('(1,2,3,4,5)', number=10000000)) # ~0.08秒
总结
- 元组是不可变的列表,支持所有列表的读取操作
()定义元组,一元组必须加逗号- 解包语法是 Python 的便利特性,可用于变量交换
- 列表和元组的选择原则:数据会变用列表,数据不变用元组