4·模块一:环境与基础入门

列表(List)与元组(Tuple)

liststuplescollections

第 4 课:列表(List)与元组(Tuple)

学习目标

完成本课学习后,你将能够:

  1. 理解并创建列表和元组。
  2. 掌握列表元素的基本操作(索引、切片、增删改)。
  3. 区分列表(可变)与元组(不可变)的核心特性。
  4. 运用列表和元组解决简单的数据组织问题。

核心概念

在编程中,我们经常需要存储一组相关的数据。比如,存储一周七天的名字、存储一次考试的全班成绩。Python 为我们提供了两种最基本的数据结构来存储这种有序的数据序列:列表(List)元组(Tuple)

1. 列表(List)

  • 定义:一个列表是一个有序的、可变的数据集合。你可以把它想象成一个购物清单,你可以随时向清单里添加商品、删除商品或修改商品的数量。
  • 创建:使用方括号 [] 来创建,元素之间用逗号 , 隔开。
  • 关键特性可变。这意味着你可以在创建列表后,修改、添加或删除其中的元素。

2. 元组(Tuple)

  • 定义:一个元组是一个有序的、不可变的数据集合。你可以把它想象成一个人的身份证号码,一旦确定,就不能更改。
  • 创建:使用圆括号 () 来创建,元素之间用逗号 , 隔开。创建只有一个元素的元组时,必须在元素后面加一个逗号,例如 (1,)
  • 关键特性不可变。一旦元组被创建,你就不能修改、添加或删除其中的任何元素。

什么时候用列表,什么时候用元组?

  • 如果你需要一个可能需要修改的数据集合(比如一个待办事项列表),使用列表
  • 如果你需要一个不应被修改的数据集合(比如坐标点 (x, y)、RGB颜色值 (255, 0, 0)),使用元组更安全。

代码示例

列表操作

# 创建一个列表
fruits = ['apple', 'banana', 'cherry', 'date']
print("初始列表:", fruits)

# 1. 访问元素 (索引从0开始)
first_fruit = fruits[0]  # 获取第一个元素
last_fruit = fruits[-1]  # 获取最后一个元素
print("第一个水果:", first_fruit)
print("最后一个水果:", last_fruit)

# 2. 切片 (获取子列表)
subset = fruits[1:3]  # 获取索引1到2的元素(不包含索引3)
print("子列表 (索引1到2):", subset)

# 3. 修改元素
fruits[1] = 'blueberry'
print("修改后的列表:", fruits)

# 4. 添加元素
# 在末尾添加
fruits.append('elderberry')
print("使用 append 添加后:", fruits)
# 在指定位置插入
fruits.insert(1, 'avocado')
print("使用 insert 在索引1插入后:", fruits)

# 5. 删除元素
# 根据值删除第一个匹配项
fruits.remove('cherry')
print("使用 remove 删除 'cherry' 后:", fruits)
# 根据索引删除
deleted_item = fruits.pop(0)  # 删除并返回索引0的元素
print("使用 pop 删除第一个元素后:", fruits, ",被删除的是:", deleted_item)

# 6. 列表长度
print("当前列表长度:", len(fruits))

元组操作

# 创建一个元组
point = (3, 4)
rgb_color = (255, 128, 0)
print("坐标点元组:", point)
print("颜色元组:", rgb_color)

# 1. 访问元素(与列表相同)
x = point[0]
y = point[1]
print("x坐标:", x, "y坐标:", y)

# 2. 切片(与列表相同)
primary_colors = (255, 0, 0, 0, 255, 0, 0, 0, 255)
red = primary_colors[0:3]
print("红色RGB元组:", red)

# 3. 尝试修改(会发生错误!)
# point[0] = 5  # 这行代码会引发 TypeError 错误

# 4. 元组拼接
new_point = point + (1,)  # 注意:创建单元素元组需要逗号
print("拼接后的元组:", new_point)

# 5. 元组长度
print("坐标点元组长度:", len(point))

实践练习

练习一:基础列表操作

  1. 创建一个包含你最喜欢的5种食物的列表。
  2. 打印整个列表。
  3. 打印出这个列表中的第三种食物。
  4. 将列表中的第一种食物替换为 "pizza"。
  5. 在列表的末尾添加一种新食物 "ice cream"。
  6. 删除列表中的第二种食物。
  7. 打印最终的列表及其长度。

预期输出示例(根据你的输入不同会变化):

原始列表: ['rice', 'noodles', 'dumplings', 'soup', 'salad']
第三种食物: dumplings
修改和添加删除后的最终列表: ['pizza', 'dumplings', 'soup', 'salad', 'ice cream']
列表长度: 5

练习二:理解可变与不可变

  1. 创建一个名为 my_tuple 的元组,值为 (10, 20, 30)
  2. 尝试使用索引将它的第一个元素改为 15(即 my_tuple[0] = 15)。
  3. 观察并理解程序输出的错误信息。
  4. 创建一个列表 my_list,初始值与元组相同 [10, 20, 30]
  5. 使用索引将列表的第一个元素改为 15
  6. 分别打印修改后的 my_list 和原始的 my_tuple

预期输出示例:

尝试修改元组时将产生错误: 'tuple' object does not support item assignment
修改后的列表: [15, 20, 30]
原始元组: (10, 20, 30)

练习三:综合小应用

创建一个程序来记录一周的每日最高温度(假设为整数)。

  1. 使用一个元组来存储星期一到星期天的英文名称 ('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun')
  2. 使用一个列表来存储对应的最高温度(请自行假定合理数据)。
  3. 使用 for 循环和 range(len(...)) 来遍历,打印出每天的天气情况,格式为 星期X: Y°C
  4. 计算并打印出这一周的平均最高温度。

常见错误

  1. 索引越界:试图访问列表或元组中不存在的索引。

    lst = [1, 2, 3]
    print(lst[3])  # 错误!索引只有 0, 1, 2
    
    • 解决:时刻记住索引从0开始,最大索引是 长度 - 1
  2. 混淆可变与不可变:试图修改元组中的元素。

    t = (1, 2, 3)
    t[0] = 99  # TypeError: 'tuple' object does not support item assignment
    
    • 解决:如果数据需要被修改,一开始就选择使用列表。
  3. 单元素元组忘记逗号

    wrong_tuple = (1)  # 这只是一个整数1,不是元组
    correct_tuple = (1,)  # 这才是单元素元组
    print(type(wrong_tuple))  # <class 'int'>
    print(type(correct_tuple)) # <class 'tuple'>
    
    • 解决:创建单元素元组时,务必在元素后加逗号。
  4. 列表方法使用错误:例如,remove() 删除的是第一个匹配的值,如果值不存在会报错。

    lst = [1, 2, 3]
    lst.remove(4)  # ValueError: list.remove(x): x not in list
    
    • 解决:使用前可以先用 in 关键字检查值是否存在。

小结

  • 列表 (list):用 [] 创建,有序可变。你可以通过索引访问、修改、添加(append, insert)和删除(remove, pop)元素。
  • 元组 (tuple):用 () 创建,有序不可变。创建后内容不能更改,适合存储不应被修改的数据。
  • 共同点:两者都是序列类型,支持通过索引切片访问元素,并且可以用 len() 函数获取长度。
  • 核心区别:在于可变性。这是选择使用哪一种数据结构的关键依据。
  • 选择建议:当数据需要频繁更新时用列表;当数据固定不变时用元组,它更安全且在某些场景下(如作为字典的键)性能更好。

理解列表和元组为你处理批量数据奠定了坚实的基础。下一课,我们将学习另外两种强大的数据结构:字典和集合。

练习编辑器

python
Loading...

继续学习

完成本课后,建议继续学习下一课「字典(Dictionary)与集合(Set)」 以巩固所学知识。