修改、添加和删除元素

您创建的大多数列表都是动态的,这意味着您将构建一个列表,然后在您的程序运行过程中添加和删除元素。 例如,您可能会创建一个游戏,玩家必须在其中射击天空中的外星人。 您可以将初始的一组外星人存储在一个列表中,然后在每次击落一个外星人时从列表中删除一个外星人。 每次屏幕上出现新的外星人时,您都将其添加到列表中。 在整个游戏过程中,您的外星人列表的长度会增加和减少。

修改列表元素

修改元素的语法类似于访问列表中元素的语法。 要更改元素,请使用列表名称后跟要更改的元素的索引,然后提供您希望该项目具有的新值。 例如,假设我们有一个摩托车列表,列表中的第一项是“本田(honda)”。 我们可以在创建列表后更改第一项的值:

motorcycles_0_first_version.py
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)

motorcycles[0] = 'ducati'
print(motorcycles)

这里我们定义了列表 motorcycles,以 'honda' 作为第一个元素。 然后我们将第一项的值更改为 'ducati' 。 输出显示第一项已更改,而列表的其余部分保持不变:

['honda', 'yamaha', 'suzuki']
['ducati', 'yamaha', 'suzuki']

您可以更改列表中任何项目的值,而不仅仅是第一项。

在列表中添加元素

出于多种原因,您可能希望向列表中添加新元素。 例如,您可能想要让新的外星人出现在游戏中,向可视化添加新数据,或者向您构建的网站添加新的注册用户。 Python 提供了几种向现有列表添加新数据的方法。

将元素追加到列表末尾

将新元素添加到列表的最简单方法是将项目追加到列表。 将项目附加到列表时,新元素将添加到列表的末尾。 使用我们在上一个示例中使用的相同列表,我们将新元素 'ducati' 添加到列表的末尾:

motorcycles_1_appending.py
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)

motorcycles.append('ducati')
print(motorcycles)

这里的 append() 方法将 'ducati' 添加到列表的末尾,而不影响列表中的任何其他元素:

['honda', 'yamaha', 'suzuki']
['honda', 'yamaha', 'suzuki', 'ducati']

append() 方法可以轻松地动态构建列表。 例如,您可以从一个空列表开始,然后使用一系列 append() 调用将项目添加到列表中。 使用空列表,将元素 "honda""yamaha""suzuki" 添加到列表中:

motorcycles_2_starting_empty.py
motorcycles = []

motorcycles.append('honda')
motorcycles.append('yamaha')
motorcycles.append('suzuki')

print(motorcycles)

结果列表看起来与前面示例中的列表完全相同:

['honda', 'yamaha', 'suzuki']

以这种方式构建列表非常普遍,因为在程序运行之前,您通常不会知道用户想要存储在程序中的数据。 要让您的用户处于控制之中,首先要定义一个空列表来保存用户的值。 然后将提供的每个新值附加到您刚刚创建的列表中。

将元素插入列表

您可以使用 insert() 方法在列表的任何位置添加新元素。 您可以通过指定新元素的索引和新项目的值来执行此操作:

motorcycles_3_inserting_elements.py
motorcycles = ['honda', 'yamaha', 'suzuki']

motorcycles.insert(0, 'ducati')
print(motorcycles)

在此示例中,我们在列表的开头插入值 "ducati"insert() 方法在位置 0 处打开一个空格,并在该位置存储值 'ducati'

['ducati', 'honda', 'yamaha', 'suzuki']

此操作将列表中的每个其他值向右移动一个位置。

从列表中删除元素

通常,您会希望从列表中删除一个项目或一组项目。 例如,当玩家从天上击落一个外星人时,您很可能希望将其从活跃外星人列表中删除。 或者,当用户决定取消他们在您创建的 Web 应用程序上的帐户时,您需要将该用户从活跃用户列表中删除。 您可以根据项目在列表中的位置或根据其值删除项目。

使用 del 语句删除项目

如果您知道要从列表中删除的项目的位置,则可以使用 del 语句:

motorcycles_4_removing_elements.py
motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)

del motorcycles[0]
print(motorcycles)

这里我们使用 del 语句从摩托车列表中删除第一项 "honda"

['honda', 'yamaha', 'suzuki']
['yamaha', 'suzuki']

如果您知道项目的索引,则可以使用 del 语句从列表中的任何位置删除项目。 例如,以下是从列表中删除第二项 "yamaha" 的方法:

motorcycles = ['honda', 'yamaha', 'suzuki']
print(motorcycles)

del motorcycles[1]
print(motorcycles)

第二辆摩托车从列表中删除:

['honda', 'yamaha', 'suzuki']
['honda', 'suzuki']

在这两个示例中,您都无法再访问在使用 del 语句后从列表中删除的值。

使用 pop() 方法删除项目

有时您会希望在从列表中删除某个项目后使用该项目的值。 例如,您可能想要获取刚刚被击落的外星人的 xy 位置,以便您可以在该位置绘制爆炸。 在 Web 应用程序中,您可能希望从活动成员列表中删除用户,然后将该用户添加到非活动成员列表中。

pop() 方法删除列表中的最后一项,但它允许您在删除后使用该项目。 术语弹出来自将列表视为一堆项目并从堆栈顶部弹出一个项目。 在这个类比中,堆栈的顶部对应于列表的末尾。 让我们从摩托车列表中弹出一辆摩托车:

motorcycles = ['honda', 'yamaha', 'suzuki'] (1)
print(motorcycles)

popped_motorcycle = motorcycles.pop() (2)
print(motorcycles) (3)
print(popped_motorcycle) (4)
1 我们首先定义并打印列表 motorcycles。
2 然后我们从列表中弹出一个值,并将该值赋给变量 popped_motorcycle 。
3 我们打印列表以显示已从列表中删除一个值。
4 然后我们打印弹出的值以证明我们仍然可以访问被删除的值。

输出显示值 "suzuki" 已从列表末尾删除,现在已分配给变量 popped_motorcycle:

['honda', 'yamaha', 'suzuki']
['honda', 'yamaha']
suzuki

这个 pop() 方法有什么用? 想象一下,列表中的摩托车是按照我们拥有它们的时间顺序存储的。 如果是这种情况,我们可以使用 pop() 方法打印关于我们购买的最后一辆摩托车的声明:

motorcycles = ['honda', 'yamaha', 'suzuki']

last_owned = motorcycles.pop()
print(f"The last motorcycle I owned was a {last_owned.title()}.")

输出是关于我们最近拥有的摩托车的简单句子:

The last motorcycle I owned was a Suzuki.

从列表中的任何位置弹出项目

您可以使用 pop() 从列表中的任何位置删除项目,方法是在括号中包含要删除的项目的索引:

motorcycles = ['honda', 'yamaha', 'suzuki']

first_owned = motorcycles.pop(0)
print(f"The first motorcycle I owned was a {first_owned.title()}.")

我们首先弹出列表中的第一辆摩托车,然后我们打印关于那辆摩托车的消息。 输出是一个简单的句子,描述了我拥有的第一辆摩托车:

The first motorcycle I owned was a Honda.

请记住,每次使用 pop() 时,您使用的项目都不再存储在列表中。

如果你不确定是使用 del 语句还是 pop() 方法,这里有一个简单的决定方法:当你想从列表中删除一个项目而不以任何方式使用该项目时,使用 del 语句; 如果要在删除项目时使用它,请使用 pop() 方法。

按值删除项目

有时您不知道要从列表中删除的值的位置。 如果您只知道要删除的项目的值,则可以使用 remove() 方法。

例如,假设我们要从摩托车列表中删除值 "ducati":

motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati']
print(motorcycles)

motorcycles.remove('ducati')
print(motorcycles)

这里的 remove() 方法告诉 Python 找出 "ducati" 出现在列表中的位置并删除该元素:

['honda', 'yamaha', 'suzuki', 'ducati']
['honda', 'yamaha', 'suzuki']

您还可以使用 remove() 方法来处理从列表中删除的值。 让我们删除值 'ducati' 并打印将其从列表中删除的原因:

motorcycles = ['honda', 'yamaha', 'suzuki', 'ducati'] (1)
print(motorcycles)

too_expensive = 'ducati' (2)
motorcycles.remove(too_expensive) (3)
print(motorcycles)
print(f"\nA {too_expensive.title()} is too expensive for me.") (4)
1 在定义列表之后,
2 我们将值 'ducati' 分配给一个名为 too_expensive 的变量。
3 然后我们使用这个变量告诉 Python 从列表中删除哪个值。
4 值 'ducati' 已从列表中删除,但仍可通过变量 too_expensive 访问,这使我们能够打印一条声明,说明我们为何从摩托车列表中删除 'ducati':
['honda', 'yamaha', 'suzuki', 'ducati']
['honda', 'yamaha', 'suzuki']

A Ducati is too expensive for me.

remove() 方法仅删除第一次出现的指定值。 如果该值有可能在列表中出现多次,则需要使用循环来确保删除所有出现的值。 您将在第 7 章中学习如何执行此操作。

自己试试

以下练习比第 2 章中的练习稍微复杂一些,但它们使您有机会以所述的所有方式使用列表。

3-4.Guest List

如果您可以邀请任何人(在世的或已故的)共进晚餐,您会邀请谁? 列出至少三个您想邀请共进晚餐的人。 然后使用您的列表向每个人打印一条消息,邀请他们共进晚餐。

3-5.Changing Guest List

您刚刚听说您的一位客人无法参加晚宴,因此您需要发出一组新的邀请函。 您必须考虑邀请其他人。 从练习 3-4 中的程序开始。 在程序末尾添加一个 print() 调用,说明不能到场的客人的姓名。 修改您的名单,用您要邀请的新人的名字替换不能到场的客人的名字。 打印第二组邀请信息,每个人仍然在您的列表中。

3-6.More Guests

您刚找到一张更大的餐桌,所以现在有更多可用空间。 考虑再邀请三位客人共进晚餐。 从练习 3-4 或 3-5 中的程序开始。 在程序末尾添加一个 print() 调用,通知人们您找到了一张更大的桌子。 使用 insert() 将一位新客人添加到列表的开头。 使用 insert() 将一位新客人添加到您的列表中间。 使用 append() 将一位新客人添加到列表末尾。 打印一组新的邀请消息,一个用于您列表中的每个人。

3-7.Shrinking Guest List

您刚刚发现您的新餐桌无法及时送达,而现在您的空间只能容纳两位客人。 从练习 3-6 中的程序开始。 添加一个新行,打印一条消息,说明您只能邀请两个人共进晚餐。 使用 pop() 从您的列表中一次删除一位客人,直到您的列表中只剩下两个名字。 每次你从列表中弹出一个名字时,打印一条消息给那个人,让他们知道你很抱歉你不能邀请他们共进晚餐。 向仍在列表中的两个人中的每一个打印一条消息,让他们知道他们仍然受到邀请。 使用 del 从列表中删除最后两个名称,因此列表为空。 打印您的列表以确保您在程序末尾确实有一个空列表。