HOWTO · Python

用 Python 将多个元素添加到列表中

我们可以通过手动添加值将多个元素追加到列表中,也可以使用 append()、extend()、concatenation 和 itertools 方法。

本页内容

要将可迭代对象中的值添加到现有 Python 列表,请使用 extend() 方法。它会原地修改该列表。append() 方法每次调用添加一个对象,而 + 和 itertools.chain 后接 list() 会创建新列表。切片赋值可以在指定位置插入值。

选择方法时,应考虑是否需要修改现有列表、新值应放在哪里,以及是否需要新结果。下面的示例展示了各个选项的行为。

使用 append() 添加单个元素

append() 是列表方法,会将参数作为一个对象添加到列表末尾。如果参数本身是一个列表,它仍会作为单个嵌套元素保留。重复调用 append() 时,每次调用都会添加一个对象。

运行此示例:

本节中的代码以及显示的标签或输出仍为英文。

values = ["red", "blue"]
values.append("green")
print(values)

要添加多个彼此独立的值,可以为每个值调用一次 append()。如果要添加的是可迭代对象中的多个值,通常直接使用 extend() 更方便。

使用 extend() 添加多个元素

extend() 会遍历一个可迭代对象,并将它产生的每个值追加到现有列表中。列表本身会被修改;该方法返回 None,因此应继续使用原来的列表变量,而不要把方法的返回值赋给它。

本节中的代码以及显示的标签或输出仍为英文。

colors = ["red", "blue"]
colors.extend(["green", "yellow"])
print(colors)

元组或字符串等其他可迭代对象也适用此方法。字符串每次产生一个字符,因此使用 "hi" 扩展列表会分别添加 "h" 和 "i"。如果希望将整个可迭代对象作为一个对象存入列表,请使用 append()。

使用切片赋值插入多个元素

切片赋值会用可迭代对象中的值替换列表中被选中的部分。空切片不会选中任何现有值,因此向空切片赋值会插入新值,并保留列表其余部分。插入位置由索引决定。

本节中的代码以及显示的标签或输出仍为英文。

items = ["a", "d"]
items[1:1] = ["b", "c"]
print(items)

这里的切片起始和结束索引都是 1,因此两个新值都会放在原有的 "d" 前面。非空切片则会替换被选中的值;如果要插入而不是替换,请检查切片边界。

使用 + 合并列表

+ 运算符会连接列表并返回一个新列表。它不会修改任一操作数;当你希望原列表保持原样、仍可继续使用时,这种方式很有用。

本节中的代码以及显示的标签或输出仍为英文。

first = [1, 2]
second = [3, 4]
combined = first + second
print(combined)

使用 + 连接列表时,两个操作数都必须是列表。如果你想将值添加到一个现有列表中,请使用 extend(),而不是创建并赋值一个连接后的结果。

使用 itertools.chain 从可迭代对象创建列表

itertools.chain 会生成一个迭代器,按顺序产生各个输入可迭代对象中的值。需要将这些值具体化为新列表时,可将它传给 list()。当输入本身已经是可迭代对象,或需要依次遍历多个数据源时,这种方式很有用;它不会修改这些数据源。实际性能取决于周边操作和数据,因此不能笼统地说它一定比其他方式更高效。

本节中的代码以及显示的标签或输出仍为英文。

from itertools import chain

numbers = [1, 2]
more_numbers = (3, 4)
combined = list(chain(numbers, more_numbers))
print(combined)

也可以在循环中直接消费该迭代器,而不创建列表。只有在需要列表结果时,才将它具体化为列表。

选择合适的方法

  • 使用 append() 添加一个对象;如果要分别处理每个值,也可以重复调用它。
  • 使用 extend() 将可迭代对象中的每个值添加到现有列表中。
  • 使用切片赋值在指定位置插入可迭代对象中的值;空切片会插入值,不会替换现有内容。
  • 使用 + 根据两个列表创建新列表,同时保持输入列表不变。
  • 使用 list(itertools.chain(...)) 将多个可迭代对象产生的值组成一个新列表。如果迭代器本身就够用,可以省略 list()。

如果常见需求是向已有列表添加多个值,优先考虑 extend()。需要按索引插入、创建单独的连接结果,或从多个数据源获得迭代器时,再选择其他方式。