HOWTO · Python

如何在 Python 中将列表转换为字符串

本教程演示了如何在 Python 中将列表转换为字符串

本页内容

要将列表转换为一个字符串,请在分隔符上调用 join(),并将字符串列表传给它。分隔符会插入相邻元素之间,不会添加在第一个元素之前或最后一个元素之后。如果列表包含数字或混合类型的值,请先将每个元素转换为文本。最后用 join() 完成拼接,再通过推导式、map() 或循环准备待拼接的元素。

使用 join() 拼接字符串列表

运行以下示例;本节代码及其显示的标签和输出均为英文:

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

words = ["Hello", "World", "from", "Python"]
print("".join(words))
print(" ".join(words))

这里展示了两种分隔符。空字符串分隔符会直接连接各个字符串;空格分隔符则会在每对相邻字符串之间插入一个空格。分隔符可以是任意字符串,例如 ", "、"-" 或 " | "。元素本身不会改变。

join() 接受一个可迭代对象,其中的元素必须是字符串。元组和其他由字符串组成的可迭代对象也可以使用它;如果值已经收集在一起,列表是常见的选择。如果某个元素是整数或其他非字符串值,对该集合调用 join() 会引发 TypeError。请先转换这些值再进行拼接,不要指望 join() 自动完成转换。

拼接前先转换非字符串元素

使用 str() 获取每个值的字符串表示形式,然后拼接这些字符串。本节代码及其显示的标签和输出均为英文:

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

values = [12, 7, 31]
result = ", ".join(str(value) for value in values)
print(result)

表达式 str(value) for value in values 是一个生成器表达式,会向 join() 提供转换后的字符串。如果之后还要重复使用转换后的元素列表,可以改用列表推导式。本节接下来的代码及其显示的标签和输出仍为英文:

values = [12, 7, 31]
strings = [str(value) for value in values]
result = ", ".join(strings)
print(result)

str() 会生成便于阅读的表示形式,但它不是通用的结构化数据序列化格式。例如,这样转换嵌套列表或字典,无法得到可供可靠保存并还原数据的格式。如果存储或交换数据时需要保留其结构,请使用专门的序列化格式。

如何选择列表推导式或 map()

列表推导式会把转换或其他逐项处理逻辑直接展示在生成的值旁边。如果需要在同一个表达式中修改、筛选元素或说明转换过程,它就很适合。上一节的生成器形式可以直接向 join() 提供元素,无须先创建另一个列表;如果需要一个可重复使用的列表,则可以使用方括号。

map() 会对每个元素应用一个函数,并返回迭代器。如果只是直接转换而不需要其他逻辑,这种写法会比较简洁。本节代码及其显示的标签和输出均为英文:

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

values = [12, 7, 31]
result = ", ".join(map(str, values))
print(result)

这两种写法都会先用 str() 转换每个数字,再由 join() 拼接结果。请选择更容易让读者理解转换过程的写法。两种方法都不会修改原列表。如果需要自定义转换,可以将 str 替换为一个能为每个元素返回字符串的函数。

使用 for 循环构建字符串

如果每个元素在加入结果前都需要经过条件判断或多个处理步骤,循环会很有用。对于简单的拼接,请使用 join();随着结果增长,在循环中反复连接字符串可能会造成额外的复制。如果确实需要使用循环,可以先收集各个片段,最后再拼接一次。本节代码及其显示的标签和输出均为英文:

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

words = ["Python", "is", "useful"]
parts = []
for word in words:
    parts.append(word)
result = " ".join(parts)
print(result)

分隔符仍然决定元素之间的间距,因此这种写法可以避免先添加再删除末尾空格。只要收集的每个片段都是字符串,也可以在循环中加入其他逻辑,例如跳过指定元素或逐项格式化。对于整数列表,应添加 str(value),而不是直接添加整数。

在常见情况下,请在分隔符上调用 join():使用 "".join(words) 直接连接,或使用 " ".join(words) 以空格分隔文本。如果元素还不是字符串,请先用推导式或 map() 转换。若循环能让逐项处理逻辑更清楚,就使用循环;需要拼接许多片段时,优先一次性完成拼接。