
4.3 添加、删除和修改列表元素
我们创建的大多数列表都将是动态的,这意味着列表创建后,将随着程序的运行来增、删、改元素。
4.3.1 在列表中添加元素
你可能出于众多原因要在列表中添加新元素,例如,你可能希望游戏中出现新的玩家、添加可视化数据或给网站添加新注册的用户。Python提供了多种在既有列表中添加新数据的方式。向列表中添加元素的常用方法有append()、extend()和insert(),这些方法的具体介绍如下。
1.append()方法——在列表末尾添加元素
传统的向列表中添加元素的方法是利用append()函数将元素一个个添加到尾部。该方法的声明如下所示:

其中,object可以是元组、列表、字典或任何其他对象。假设前面的例子中我们忘记了添加Watermelon,没关系,由于列表是可变的,可以方便地把它添加到尾部:

2.insert()方法——在指定位置插入元素
insert()方法用于将元素插入列表的指定位置。例如:
【示例5】 insert()方法

上述代码使用insert()方法将新元素Peter插入到列表names中索引为2的位置。程序运行结果:

append()函数只能将新元素插入到列表尾部,而使用insert()可以将元素插入到列表的任意位置。指定偏移量为0可以插入到列表头部。如果指定的偏移量超过了尾部,则会插入到列表最后,就如同append()一样,这一操作不会产生Python异常。

3.使用extend()或+=合并列表
extend()方法用于在列表末尾一次性添加另一个序列中的所有元素,即使用新列表扩展原来的列表。一个好心人又给了我们一份其他水果的名字列表others,我们希望能把它加到已有的fruits列表中:

也可以使用+=:

如果错误地使用了append(),那么others会被当成一个单独的元素进行添加,而不是将其中的内容进行合并:

这个例子再次体现了列表可以包含不同类型的元素。上面的列表包含了4个字符串元素以及一个含有两个字符串的列表元素。
4.3.2 修改列表元素
修改列表元素的语法与访问列表元素的语法类似。要修改列表元素,可指定列表名和要修改的元素的索引,再指定该元素的新值。就像可以通过偏移量访问某元素一样,你也可以通过赋值对它进行修改:

与之前一样,列表的偏移量必须是合法有效的。通过这种方式无法修改字符串中的指定字符,因为字符串是不可变的。列表是可变的,因此你可以改变列表中的元素个数,以及元素的值。
4.3.3 删除列表元素
我们经常需要从列表中删除一个或多个元素。例如,当用户在你创建的Web应用中注销其账户时,你需要将该用户从活跃用户列表中删除。你可以根据位置或值来删除列表中的元素。删除列表元素的常用方式有del语句、remove()方法和pop()方法,具体介绍如下。
1.del语句——删除指定位置的元素
如果知道要删除的元素在列表中的位置,可使用del语句。在前面的水果列表中我们要删除Grape信息,因此我们需要撤销刚才最后插入的元素:

当列表中一个元素被删除后,位于它后面的元素会自动往前移动填补空出的位置,且列表长度减1。再试试从更新后的fruits列表中删除Orange:

del是Python语句,而不是列表方法——无法通过fruits[-2].del()进行调用。del就像是赋值语句(=)的逆过程:它将一个Python对象与它的名字分离。如果这个对象无其他名称引用,则其占用空间也会被清除。
2.remove()方法——根据值删除元素
remove()方法用于移除列表中的某个元素,该方法的声明如下所示:

该方法将删除元素value。若列表中有多个匹配的元素,则只会移除匹配到的第一个元素。如果value不在列表中,则Python将抛出ValueError异常。如果不确定或不关心元素在列表中的位置,则可以使用remove()根据指定的值删除元素。例如:

注意
方法remove()只删除第一个指定的值。如果要删除的值可能在列表中出现多次,就需要使用循环来判断是否删除了所有这样的值。
3.pop()方法——获取并删除指定位置的元素
有时候,你要将元素从列表中删除,并接着使用它的值。例如,在Web应用程序中,你可能要将用户从活跃成员列表中删除,并将其加入非活跃成员列表中。方法pop()可删除列表末尾的元素,并让你能够接着使用它。术语弹出(pop)源自这样的类比:列表就像一个栈,而删除列表末尾的元素相当于弹出栈顶元素。使用pop()同样可以获取列表中指定位置的元素,但在获取完成后,该元素会被自动删除。如果你为pop()指定了偏移量,它会返回偏移量对应位置的元素;如果不指定,则默认使用-1。因此,pop(0)将返回列表的头元素,而pop()或pop(-1)则会返回列表的尾元素:

说明
如果使用append()来添加元素到尾部,并通过pop()从尾部删除元素,实际上,就实现了一个被称为LIFO(后进先出)队列的数据结构。我们更习惯称之为栈(stack)。如果使用pop(0)来删除元素则创建了一个FIFO(先进先出)队列。这两种数据结构非常有用,你可以不断接收数据,并根据需求对最先到达的数据(FIFO)或最后到达的数据(LIFO)进行处理。
4.3.4 技能训练
上机练习9好友管理系统
需求说明
如今的社交软件层出不穷,虽然功能千变万化,但都具有好友管理系统的基本功能,包括添加好友、删除好友、备注好友、展示好友等。下面是一个简单的好友管理系统的功能菜单,如图4-1所示。

图4-1 好友管理系统的功能菜单
图4-1所示的好友管理系统有5个功能,每个功能都对应一个序号,用户可根据提示“请输入您的选项”选择序号执行相应的操作,包括:
➢ 添加好友:用户根据提示“请输入要添加的好友:”输入要添加好友的姓名,添加后会提示“好友添加成功”。
➢ 删除好友:用户根据提示“请输入要删除好友的姓名:”输入要删除好友的姓名,删除后提示“删除成功”。
➢ 备注好友:用户根据提示“请输入要修改的好友姓名:”和“请输入修改后的好友姓名:”分别输入修改前和修改后的好友姓名,修改后会提示“备注成功”。
➢ 展示好友:若用户还没有添加过好友,提示“好友列表为空”,否则返回每个好友的姓名。
➢ 退出:关闭好友管理系统。
编写程序,模拟实现如上所述的好友管理系统。