Python 列表与元组

PythonBeginner
立即练习

介绍

欢迎来到这个关于 Python 列表(Lists)和元组(Tuples)的实操实验(Lab)。列表是 Python 中最基本和最通用的数据结构之一,它允许你存储有序的项目集合。元组与列表相似,但有一个关键区别:它们是不可变的(immutable)。

在整个实验中,你将学习如何创建列表、访问和操作它们的元素,以及执行排序和循环等常见操作。你还将探索元组,并了解何时应该使用元组而不是列表。

这个实验环境是一个预配置的 WebIDE。所有必要的实验文件都已为你创建在 /home/labex/project 目录下。让我们开始吧。

访问列表元素

在这一步,你将学习如何使用索引(indexes)检索列表中的元素,以及如何使用切片(slicing)提取子列表。列表是包含在方括号 [] 中的有序项集合。

首先,从左侧的文件浏览器中打开文件 step1_access.py。我们将在该文件中编写代码。

注意: 如果你不熟悉使用 WebIDE(类似 VS Code),请先在 此 Lab 学习如何使用。

使用索引获取值

列表元素的访问使用基于零的索引,这意味着第一个元素位于索引 0 处。

将以下代码添加到 step1_access.py 中以创建一个列表并访问其第一个元素:

## step1_access.py

furniture = ['table', 'chair', 'rack', 'shelf']

## 访问第一个元素(索引 0)
print(furniture[0])

要运行脚本,请在 WebIDE 中打开一个终端并执行以下命令:

python3 /home/labex/project/step1_access.py

你应该会在控制台中看到列表的第一个元素被打印出来。

输出:

table

负数索引

你也可以使用负数索引从列表末尾访问元素。索引 -1 指向最后一个元素,-2 指向倒数第二个,依此类推。

修改 step1_access.py 以访问最后一个元素:

## step1_access.py

furniture = ['table', 'chair', 'rack', 'shelf']

## 访问最后一个元素(索引 -1)
print(furniture[-1])

再次运行脚本:

python3 /home/labex/project/step1_access.py

输出:

shelf

使用切片获取子列表

切片允许你使用 [start:end] 语法获取一个子列表。start 索引是包含的,而 end 索引是不包含的。

让我们来练习一下。对于你的验证挑战,修改 step1_access.py 以创建一个列表并打印它的一个切片。用以下代码替换现有内容:

## step1_access.py

furniture = ['table', 'chair', 'rack', 'shelf']

## 获取从索引 1 开始到索引 3 之前(不包括索引 3)的子列表
sublist = furniture[1:3]
print(sublist)

运行脚本查看结果:

python3 /home/labex/project/step1_access.py

输出:

['chair', 'rack']

你也可以使用完整的切片 [:] 来创建一个列表的副本。对原始列表的任何修改都不会影响副本。

## step1_access.py

spam = ['cat', 'bat', 'rat', 'elephant']
spam2 = spam[:]  ## 创建一个浅拷贝(shallow copy)
spam.append('dog')

print(spam)
print(spam2)

运行脚本:

python3 /home/labex/project/step1_access.py

输出:

['cat', 'bat', 'rat', 'elephant', 'dog']
['cat', 'bat', 'rat', 'elephant']

成功打印出 ['chair', 'rack'] 切片后,点击 Verify 按钮进入下一步。

修改和操作列表

在这一步,你将探索如何管理和修改列表内容。这包括更改值、合并列表以及添加新元素。

打开文件 step2_modify.py 开始。

使用 len() 获取列表长度

len() 函数返回列表中项目的数量。

将此代码添加到 step2_modify.py 中:

## step2_modify.py

furniture = ['table', 'chair', 'rack', 'shelf']
print(len(furniture))

运行脚本:

python3 /home/labex/project/step2_modify.py

输出:

4

使用索引更改值

你可以通过为特定索引赋新值来更改列表中的元素。

## step2_modify.py

furniture = ['table', 'chair', 'rack', 'shelf']
furniture[0] = 'desk'  ## 更改第一个元素
print(furniture)

运行脚本:

python3 /home/labex/project/step2_modify.py

输出:

['desk', 'chair', 'rack', 'shelf']

使用拼接和复制

你可以使用 + 运算符(拼接,concatenation)合并两个列表,或使用 * 运算符(复制,replication)重复列表的内容。

## step2_modify.py

list1 = [1, 2, 3]
list2 = ['A', 'B', 'C']
combined_list = list1 + list2
print(combined_list)

replicated_list = ['X'] * 3
print(replicated_list)

运行脚本:

python3 /home/labex/project/step2_modify.py

输出:

[1, 2, 3, 'A', 'B', 'C']
['X', 'X', 'X']

使用 append() 和 insert() 添加值

  • append() 方法将一个项目添加到列表的末尾。
  • insert() 方法在指定的索引处添加一个项目。

对于你的验证任务,让我们结合这些操作。用以下代码替换 step2_modify.py 的内容。此脚本将创建一个列表,在末尾添加一个元素,并在开头插入另一个元素。

## step2_modify.py

furniture = ['table', 'chair', 'rack', 'shelf']

## 将 'bed' 添加到列表末尾
furniture.append('bed')

## 将 'desk' 插入到列表开头(索引 0)
furniture.insert(0, 'desk')

print(furniture)

运行脚本查看最终修改后的列表:

python3 /home/labex/project/step2_modify.py

输出:

['desk', 'table', 'chair', 'rack', 'shelf', 'bed']

一旦你的脚本产生了正确的输出,点击 Verify。

移除值和排序

在这一步,你将学习移除列表中项目和对列表内容进行排序的不同方法。

请打开文件 step3_remove.py。

移除值

Python 提供了几种从列表中移除项目的方法:

  • del 语句: 移除特定索引处的项目。
  • remove() 方法: 移除特定值第一次出现的位置。
  • pop() 方法: 移除并返回特定索引处的项目(如果未给出索引,则移除并返回最后一个项目)。

让我们看看它们的实际应用。将以下内容添加到 step3_remove.py 中:

## step3_remove.py

furniture = ['table', 'chair', 'rack', 'shelf']
del furniture[2]  ## 移除 'rack'
print(furniture)

furniture.remove('chair') ## 移除 'chair'
print(furniture)

运行脚本:

python3 /home/labex/project/step3_remove.py

输出:

['table', 'chair', 'shelf']
['table', 'shelf']

使用 sort() 排序值

sort() 方法会就地(in place)对列表进行排序。默认情况下,它按升序排序。

## step3_remove.py

numbers = [2, 5, 3.14, 1, -7]
numbers.sort()
print(numbers)

letters = ['a', 'z', 'A', 'Z']
letters.sort(key=str.lower) ## 不区分大小写的排序
print(letters)

运行脚本:

python3 /home/labex/project/step3_remove.py

输出:

[-7, 1, 2, 3.14, 5]
['a', 'A', 'z', 'Z']

对于你的验证任务,你需要创建一个列表,移除一个特定的项目,然后对剩余的项目进行排序。用以下内容替换 step3_remove.py 的内容:

## step3_remove.py

furniture = ['table', 'chair', 'rack', 'shelf']

## 移除项目 'rack'
furniture.remove('rack')

## 按字母顺序对列表进行排序
furniture.sort()

print(furniture)

运行脚本查看结果:

python3 /home/labex/project/step3_remove.py

输出:

['chair', 'shelf', 'table']

在你的脚本正确移除并排序列表后,点击 Verify。

循环和高级技巧

在这一步,你将掌握如何遍历列表以及使用一些高级但非常有用的列表技巧。

请打开文件 step4_loop.py 进行本节学习。

使用 for 循环

for 循环是遍历列表中项目的标准方法。

## step4_loop.py

furniture = ['table', 'chair', 'rack', 'shelf']

for item in furniture:
    print(item)

运行脚本:

python3 /home/labex/project/step4_loop.py

输出:

table
chair
rack
shelf

使用 enumerate() 获取索引和值

如果在迭代过程中需要索引和值,请使用 enumerate() 函数。

## step4_loop.py

furniture = ['table', 'chair', 'rack', 'shelf']

for index, item in enumerate(furniture):
    print(f'index: {index} - item: {item}')

运行脚本:

python3 /home/labex/project/step4_loop.py

输出:

index: 0 - item: table
index: 1 - item: chair
index: 2 - item: rack
index: 3 - item: shelf

in 和 not in 运算符

这些运算符允许你检查一个值是否存在于列表中。

## step4_loop.py

furniture = ['table', 'chair', 'rack', 'shelf']
print('rack' in furniture)
print('bed' not in furniture)

运行脚本:

python3 /home/labex/project/step4_loop.py

输出:

True
True

使用 zip() 循环处理多个列表

zip() 函数非常适合并行处理多个列表。它将每个列表中的元素配对。

对于你的验证任务,你将使用 zip() 来组合两个列表。用以下代码替换 step4_loop.py 的内容。它将遍历家具项目及其对应的价格,为每对打印一个格式化的字符串。

## step4_loop.py

furniture = ['table', 'chair', 'rack', 'shelf']
price = [100, 50, 80, 40]

for item, amount in zip(furniture, price):
    print(f'The {item} costs ${amount}')

运行脚本查看组合后的输出:

python3 /home/labex/project/step4_loop.py

输出:

The table costs $100
The chair costs $50
The rack costs $80
The shelf costs $40

一旦你的脚本正常工作,点击 Verify。

理解元组 (Tuples)

在最后这一步,你将学习元组 (tuple) 数据类型。元组与列表类似,但它们是**不可变的 (immutable)**,这意味着创建后其内容不能被更改。

请打开文件 step5_tuple.py。

元组数据类型

元组使用圆括号 () 而不是方括号来定义。由于它们是不可变的,一旦元组创建,你就不能更改、添加或移除其中的元素。这使得它们在内存效率上更高,并且适用于不应被修改的数据。

你可以像使用列表一样,使用索引和切片来访问元组的元素。

## step5_tuple.py

furniture = ('table', 'chair', 'rack', 'shelf')

## 访问元素
print(furniture[0])

## 切片
print(furniture[1:3])

## 获取长度
print(len(furniture))

运行脚本:

python3 /home/labex/project/step5_tuple.py

输出:

table
('chair', 'rack')
4

如果你尝试修改元组,Python 将会引发一个 TypeError。例如,furniture[0] = 'desk' 会导致错误。

在 list() 和 tuple() 之间转换

你可以使用 list() 和 tuple() 构造函数轻松地在列表和元组之间进行转换。

对于你的验证任务,你需要将一个列表转换为一个元组。用以下代码替换 step5_tuple.py 的内容:

## step5_tuple.py

## 一个项目列表
my_list = ['cat', 'dog', 5]

## 将列表转换为元组
my_tuple = tuple(my_list)

print(my_tuple)

运行脚本查看生成的元组:

python3 /home/labex/project/step5_tuple.py

输出:

('cat', 'dog', 5)

如果你需要修改它,你也可以将元组转换回列表:

## step5_tuple.py

my_tuple = ('cat', 'dog', 5)
my_list = list(my_tuple)
print(my_list)

运行脚本:

python3 /home/labex/project/step5_tuple.py

输出:

['cat', 'dog', 5]

一旦你的脚本成功将列表转换为元组并打印出来,点击 Verify 完成本次实验。

总结

恭喜你完成了本次实验!你已经对 Python 的核心数据结构:列表 (lists) 和元组 (tuples) 建立了扎实的理解。

你已经学会了如何:

  • 创建列表,并使用正向和负向索引访问元素。
  • 使用切片 (slicing) 提取子列表。
  • 通过更改值、使用 append() 和 insert() 添加元素,以及使用 del、remove() 和 pop() 移除元素来修改列表。
  • 使用 sort() 方法对列表进行原地排序 (in-place sorting)。
  • 使用 for 循环、enumerate() 和 zip() 有效地遍历列表。
  • 理解元组的不可变性 (immutable nature),以及在列表和元组之间进行转换。

这些技能是任何 Python 程序员的基础,在您未来的项目中将非常宝贵。