对python的再认识-基于数据结构进行-a005-元组-CRUD

Python Tuple 元组的CURD

本文聚焦 Python 元组的核心操作与不可变性,包含增删改查四大基础操作与详细复杂度分析。

我也将给出个人思维导图


一、增(Create)

元组创建后不可修改,因此"增"只能通过拼接创建新元组。

1.1 基础创建方式

python 复制代码
# 空元组
empty = ()
# 或
empty = tuple()

# 多个元素
nums = (1, 2, 3)
nums = 1, 2, 3  # 省略括号(逗号才是关键)

# 单个元素(必须有逗号)
single = (1,)      # 正确:元组
wrong = (1)        # 错误:这只是整数 1

# 验证类型
type((1,))   # <class 'tuple'>
type((1))    # <class 'int'>

注意 :逗号 , 才是创建元组的关键,括号 () 只是辅助。

1.2 从可迭代对象创建

时间复杂度 O(n)(n 为可迭代对象长度)。

python 复制代码
# 从列表创建
t = tuple([1, 2, 3])
# (1, 2, 3)

# 从字符串创建
t = tuple('hello')
# ('h', 'e', 'l', 'l', 'o')

# 从 range 创建
t = tuple(range(3))
# (0, 1, 2)

1.3 拼接("增加"元素)

元组不可变,只能通过拼接创建新元组,时间复杂度 O(n+m)

python 复制代码
t1 = (1, 2)
t2 = (3, 4)

# 拼接返回新元组
result = t1 + t2
# (1, 2, 3, 4)

# 原元组不变
print(t1)  # (1, 2)

注意:拼接创建新元组,而非原地修改。频繁拼接会有性能问题。


二、查(Read)

元组的访问方式与列表完全相同。

2.1 索引访问

通过下标获取元素,时间复杂度 O(1)

python 复制代码
t = ('a', 'b', 'c', 'd')

# 正向索引
first = t[0]         # 'a'
third = t[2]         # 'c'

# 负向索引(倒数)
last = t[-1]         # 'd'
second_last = t[-2]  # 'c'

2.2 切片访问

获取子元组,时间复杂度 O(k)(k 为切片长度)。

python 复制代码
t = (0, 1, 2, 3, 4, 5)

# 基础切片 [start:stop]
t[1:4]               # (1, 2, 3)(含头不含尾)

# 步长切片 [start:stop:step]
t[::2]               # (0, 2, 4)(每隔一个)
t[::-1]              # (5, 4, 3, 2, 1, 0)(反转)

# 省略参数
t[:3]                # (0, 1, 2)(从头开始)
t[3:]                # (3, 4, 5)(到末尾结束)

2.3 成员检测与查找

python 复制代码
t = (10, 20, 30, 20)

# 存在性检测 - O(n)
20 in t              # True
50 not in t          # True

# 查找索引 - O(n),返回第一个匹配
t.index(20)          # 1
t.index(20, 2)       # 3(从索引 2 开始搜索)

# 统计出现次数 - O(n)
t.count(20)          # 2

三、改(Update)

元组不可修改 ,没有 appendinsertextend 等方法。

3.1 不可变性示例

python 复制代码
t = (1, 2, 3)

# 尝试修改元素 - 报错
t[0] = 10
# TypeError: 'tuple' object does not support item assignment

# 尝试添加元素 - 报错
t.append(4)
# AttributeError: 'tuple' object has no attribute 'append'

# 尝试删除元素 - 报错
del t[0]
# TypeError: 'tuple' object doesn't support item deletion

警告:元组一旦创建就无法修改,这是其与列表的核心区别。

3.2 变通方法:切片拼接

通过切片和拼接创建新元组,时间复杂度 O(n)(非原地修改)。

python 复制代码
t = (1, 2, 3, 4, 5)

# 目标:把索引 2 的元素 3 替换为 99
# 方法:切片 + 拼接
t = t[:2] + (99,) + t[3:]
# (1, 2, 99, 4, 5)

# 注意:这是创建新元组,不是原地修改

注意:这实际上创建了新元组,而非修改原元组。


四、删(Delete)

元组不可删除元素,只能删除整个元组。

4.1 删除整个元组

python 复制代码
t = (1, 2, 3)

# 删除整个元组
del t
# print(t)  # NameError: name 't' is not defined

4.2 无法删除单个元素

python 复制代码
t = (1, 2, 3)

# 无法删除单个元素
del t[0]  # TypeError: 'tuple' object doesn't support item deletion

# 没有 remove 方法
t.remove(1)  # AttributeError: 'tuple' object has no attribute 'remove'

# 没有 pop 方法
t.pop()  # AttributeError: 'tuple' object has no attribute 'pop'

警告:元组不支持任何形式的元素删除操作。


五、元组 vs 列表

特性 列表 list 元组 tuple
可变性 可变 不可变
语法 [1, 2, 3] (1, 2, 3)
创建方法 append/insert 只能拼接新元组
修改元素 lst[0] = x 不允许
删除元素 pop/remove/del 不允许
哈希 不可哈希 可哈希(元素可哈希时)

5.1 可变性对比

python 复制代码
# 列表:可修改
lst = [1, 2, 3]
lst[0] = 10       # [10, 2, 3]
lst.append(4)     # [10, 2, 3, 4]
del lst[1]        # [10, 3, 4]

# 元组:不可修改
t = (1, 2, 3)
t[0] = 10         # TypeError
t.append(4)       # AttributeError
del t[0]          # TypeError

5.2 使用场景

python 复制代码
# 列表:需要修改的数据
scores = [85, 92, 78]
scores.append(95)     # 可添加
scores.remove(78)     # 可删除

# 元组:固定数据、字典键
# 作为字典键(可哈希)
locations = {
    (40.7, -74.0): 'New York',
    (51.5, -0.1): 'London'
}

# 列表无法作为字典键
# locations = {[40.7, -74.0]: 'New York'}  # TypeError

六、操作复杂度总结

操作 方法 平均复杂度 说明
创建 tuple() O(n) 需要复制所有元素
拼接 t1 + t2 O(n+m) 创建新元组
索引访问 t[i] O(1) 直接内存寻址
切片访问 t[i:j] O(k) k 为切片长度
成员检测 x in t O(n) 线性扫描
索引查找 t.index(x) O(n) 线性扫描
计数 t.count(x) O(n) 遍历统计
修改元素 不允许 - 元组不可变
删除元素 不允许 - 元组不可变

相关推荐
chilavert3187 小时前
技术演进中的开发沉思-356:重排序(中)
java·开发语言
jianghua0017 小时前
Python中的简单爬虫
爬虫·python·信息可视化
wengqidaifeng7 小时前
数据结构(三)栈和队列(上)栈:计算机世界的“叠叠乐”
c语言·数据结构·数据库·链表
devmoon7 小时前
为 Pallet 搭建最小化 Mock Runtime 并编写单元测试环境
开发语言·单元测试·区块链·智能合约·polkadot
静听山水7 小时前
Redis核心数据结构
数据结构·数据库·redis
喵手7 小时前
Python爬虫实战:针对Python官网,精准提取出每一个历史版本的版本号、发布日期以及对应的文档/详情页链接等信息,并最终清洗为标准化的CSV文件!
爬虫·python·爬虫实战·零基础python爬虫教学·python官方数据采集·采集历史版本版本号等信息·导出csv文件
im_AMBER8 小时前
Leetcode 115 分割链表 | 随机链表的复制
数据结构·学习·算法·leetcode
Coder_Boy_8 小时前
Java开发者破局指南:跳出内卷,借AI赋能,搭建系统化知识体系
java·开发语言·人工智能·spring boot·后端·spring
数智工坊8 小时前
【数据结构-树与二叉树】4.7 哈夫曼树
数据结构