Python 的元组(tuple,简写为tup)与列表类似,不同之处在于元组的元素不能修改。
元组使用小括号(),列表使用方括号[]。
创建元组
# 创建一个空原元组
empty_tup = ()
print(empty_tup)
# 输出:()
# 创建一个包含多个元素的元组
number = (1, 2, 3,4 ,5)
print(number)
# 输出:(1, 2, 3, 4, 5)
# 单个元素的元组
singleton = (1,)
print(singleton)
# 输出:(1,)
访问元组元素
print(number[0])
# 输出: 1
# 元组切片
print(number[1:3])#获取第2到第3个元素(不包括索引3)
# 输出:(2, 3)
# 不可变性
number = (1,2,3)
# number[1] = 3
# 输出异常: TypeError
# File "f:\rgzn\Python\tuple_demo.py", line 25, in <module>
# number[1] = 3
# TypeError: 'tuple' object does not support item assignment
多级元组操作示例
# 创建一个多级元组
teacher = (
('Alice',20, ('Math',95),('Tom',88)),
('Bob',22,('Marth',82),('Science',92)),
('Charlie',14,('Marth',90),('Science',85))
)
# 访问第一老师的名字
print(teacher[0][0])
# 输出 Alice
# 访问第二老师的学习成绩
print(teacher[1][2][1])
# 输出 82
# 访问Bob 的所有数据
print(teacher[1])
# 输出('Bob', 22, ('Marth', 82), ('Science', 92))
# 访问Charlie的科学成绩
print(teacher[2][3][1])
# 输出85
遍历多级元组
for student in teacher:
name = student[0]
age = student[1]
math_score = student[2][1]
print(f'{name}今年{age}岁了,他数学考了{math_score}分,科学考了{student[3][1]}分')
# 输出
# Alice今年20岁了,他数学考了95分,科学考了88分
# Bob今年22岁了,他数学考了82分,科学考了92分
# Charlie今年14岁了,他数学考了90分,科学考了85分
修改多级元组
# 注意: 我们无法直接修改元组,但是可以创建新的元组
update_teacher = []
for student in teacher:
if student[0] == 'Charlie':
new_teacher = (student[0],student[1],(student[2][0],student[2][1]+5),student[3])
update_teacher.append(new_teacher)
else:
update_teacher.append(student)
# list 再转化成 tuple
update_teacher = tuple(update_teacher)
# 打印结果
print(update_teacher)
# 输出: (('Alice', 20, ('Math', 95), ('Tom', 88)), ('Bob', 22, ('Marth', 82), ('Science', 92)), ('Charlie', 14, ('Marth', 95), ('Science', 85)))
# 修改元组的另外一种方式
# 在Python中,元组(tuple)是不可变的,这意味着一旦你创建了一个元组,你就不能更改它里面的元素。
# 但是,如果元组中的元素是可变类型(比如列表list),你可以修改这个可变类型元素的内容,而不会违反元组的不可变性。
# 这是因为元组的不可变性是指你不能更改元组中的元素引用(即你不能将元组中的一个元素替换为另一个元素),而不是指你不能更改元素本身(如果它是可变的)。
# 创建一个带有 list的 元组
my_tuple = (1,2,3,[4,5],'a','b')
# 如果直接修改会报错TypeError
# my_tuple[3] = [1,2,3]
print(id(my_tuple))
# 输出:2039667320544
# 可以直接修改list里的值
my_tuple[3][0] = 'a'
my_tuple[3][1] = 'b'
# my_tuple[3][2] = 'c' # 这种会报错 IndexError 数组越界
my_tuple[3].append('c') # 这种可以成功
print(my_tuple)
# 输出:(('Alice', 20, ('Math', 95), ('Tom', 88)), ('Bob', 22, ('Marth', 82), ('Science', 92)), ('Charlie', 14, ('Marth', 95), ('Science', 85)))
print(id(my_tuple))
# 输出:2039667320544
# 输出:(1, 2, 3, ['a', 'b', 'c'], 'a', 'b')
# 总结: 本身元组无法修改的,我们可以通过新建list 获取 元组的值进行修改 再组装成元组方式进行元组修改
# 如果元组中具备可修改类型的数据,可以对可变类型进行修改,注意不可直接赋值修改,需要到可修改的内容里修改
# 上述例子中 list 可以通过下标赋值, 可以通过append()增加元素
# 如果修改元组的list数据 修改前和修改后的内存地址一致
元组的内置函数
my_tuple = (1,2,3,4,5,6,7,8,9)
# 返回元组的长度
print(len(my_tuple))
# 输出9
# 返回元组的最大值 - 元组内的数据必须同类型才可以
print(max(my_tuple))
# 输出9
# 返回元组的最小值 - 元组内的数据必须同类型才可以
print(min(my_tuple))
# 输出1
# 比较两个元组
my_tuple = (1,2,3,4,5,6,7,8,9)
my_tuple2= (1,2,3,4,5,6,7,8,9)
my_tuple3= (1,2,3,4,5,6,7,8,'9')
# operator 在3.10中会报错 后面改成 == 可以
# print(operator(my_tuple,my_tuple2))
print(my_tuple == my_tuple2)
# 输出True
print(my_tuple == my_tuple3)
# 输出False
元组的内置函数
# 元组重新赋值后 内存地址改变
my_tuple4= (1,2,3,4,5,6,7,8,9)
print(id(my_tuple4))
# 输出:2039667116848
my_tuple4= (1,2,3,4,5,6,7,8,'9')
print(id(my_tuple4))
# 输出:2039667124240
两个元组数据的操作
比较
tuple1 = (1, 2, 3)
tuple2 = (1, 2, 3)
tuple3 = (1, 2, 4)
print(tuple1 == tuple2) # 输出: True
print(tuple1 != tuple3) # 输出: True
print(tuple1 < tuple3) # 输出: True,因为第一个不同的元素1 < 4
合并
tuple1 = (1, 2, 3)
tuple2 = ('a', 'b', 'c')
# 使用 + 运算符合并
merged_tuple = tuple1 + tuple2
print(merged_tuple) # 输出: (1, 2, 3, 'a', 'b', 'c')
# 使用 * 运算符重复元组(这不是合并,但展示了另一种操作)
repeated_tuple = tuple1 * 2
print(repeated_tuple) # 输出: (1, 2, 3, 1, 2, 3)
遍历
tuple1 = (1, 2, 3)
tuple2 = ('a', 'b', 'c')
# 分别遍历
for item in tuple1:
print(item)
for item in tuple2:
print(item)
# 同时遍历(使用zip)
for item1, item2 in zip(tuple1, tuple2):
print(item1, item2)
使用元组作为字典的键或者结合的元素
my_dict = {(1, 2): 'a', (3, 4): 'b'}
print(my_dict[(1, 2)]) # 输出: a
my_set = {(1, 2), (3, 4), (5, 6)}
print(my_set) # 输出可能不同,因为集合是无序的
转换和映射
tuple1 = (1, 2, 3, 4, 5)
# 创建一个新元组,其元素是原始元组元素的平方
squared_tuple = tuple(x**2 for x in tuple1)
print(squared_tuple) # 输出: (1, 4, 9, 16, 25)