元组

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)
posted @ 2024-07-25 18:08  文武双全·墨海纵横  阅读(66)  评论(0)    收藏  举报