HOWTO · Python
如何在 Python 列表中替换一个元素
在 Python 列表中,可通过索引赋值替换已知位置的值;也可使用 for 循环、列表推导式或 map() 配合替换函数,按条件替换值。本文介绍这些方法,并说明它们是修改原列表还是创建新列表。
本页内容
已知位置时,可通过索引赋值替换 Python 列表中的值。若要替换符合条件的值,可以使用带 enumerate() 的循环、将列表推导式的结果重新赋给变量,或使用 map() 配合替换函数。索引赋值和循环会修改现有列表;列表推导式或转换为列表的 map() 会创建新列表。
按索引替换单个元素
列表索引从 0 开始,因此索引 2 指向第三个元素。直接将替换值赋给该位置:
运行此示例:
本节中的代码以及显示的标签或输出仍为英文。
prices = [12, 18, 25, 31]
prices[2] = 27
print(prices)
这会原地更新 prices,因此其他引用同一列表的变量也会看到变化。已知元素位置时适合使用这种方法。如果要根据其他数据计算索引,请先确认该索引对应列表中的现有元素,再进行赋值。
用循环替换符合条件的元素
如果要根据条件确定哪些值需要替换,可以使用 enumerate() 同时遍历位置和元素。借助索引,循环可以将替换值赋回原列表:
运行此示例:
本节中的代码以及显示的标签或输出仍为英文。
scores = [62, 85, 62, 91]
for index, score in enumerate(scores):
if score == 62:
scores[index] = 70
print(scores)
所有符合条件的分数都会被替换,包括重复值。循环会修改同一个列表,而不是创建替换后的新列表。如果替换规则需要执行多条语句,或者需要更新原对象,可以使用循环。
用列表推导式替换符合条件的元素
列表推导式可以用一个表达式表示条件替换。如果希望变量引用替换后的值,请将推导式的结果重新赋给该变量:
运行此示例:代码和输出中的示例字符串保留英文。
本节中的代码以及显示的标签或输出仍为英文。
names = ["Ada", "Guest", "Lin", "Guest"]
names = ["Visitor" if name == "Guest" else name for name in names]
print(names)
列表推导式会创建新列表;将结果赋给 names 后,该变量便会引用这个新列表。其他仍引用原列表的变量会继续引用原列表。不赋值的列表推导式只会创建结果后将其丢弃,因此不会替换原列表中的值。对于每个输入值都产生一个输出值的简单规则,这种写法很合适。
用 map() 转换列表元素
map() 会将一个函数应用于每个元素。如果需要列表形式的结果,可以将映射后的值传给 list():
运行此示例:代码和输出中的示例字符串保留英文。
本节中的代码以及显示的标签或输出仍为英文。
def replace_guest(name):
return "Visitor" if name == "Guest" else name
names = ["Ada", "Guest", "Lin"]
updated_names = list(map(replace_guest, names))
print(updated_names)
这里的函数会为符合条件的值返回替换值,并让其他值保持不变。将结果转换为列表会创建新列表,不会改变 names。如果转换逻辑已经写成有名称的函数,或需要在其他地方重复使用,这种方式就很实用;对于简短的内联规则,列表推导式可能更易阅读。
选择合适的方法
已知单个位置时,使用索引赋值。若条件选中了多个元素,而且需要修改原列表,可以使用带 enumerate() 的循环。如果想用简洁的条件转换创建新列表,可以使用列表推导式。当将函数应用于每个值能让转换逻辑更清晰时,可以使用 map();如果代码需要列表形式,再将结果转换为列表。
这些方法的主要区别在于规则的表达方式,以及它们会修改现有列表还是创建新列表。请根据手头的数据,以及程序的其他部分是否需要看到原列表的变化来选择。没有一种写法适用于所有替换任务。