HOWTO · Python

在 Python 中将元组转换为字符串

本教程演示了如何在 python 中将元组转换为字符串

本页内容

在 Python 中将元组转换为字符串是一项常见任务,无论是为日志记录准备输出、为显示格式化数据,还是将值写入文件。元组是可以存放不同类型项目的不可变序列,Python 提供了多种将其转换为字符串的方法。正确的选择取决于你需要的确切结果。

选择与目标相匹配的字符串形式

“将元组转换为字符串”可能意味着两件不同的事情。对元组调用 str() 会返回它的字符串表示形式——也就是你在 REPL 中会看到的同样文本,包括括号、逗号以及字符串元素周围的引号。这种形式对调试或日志记录很有用,但它很少是你想展示给用户的内容。

另一种结果是由元组的元素构建而成的字符串。join() 方法用你选择的分隔符将元素拼接起来,循环让你对每个元素的格式进行精细控制,而 reduce() 则把元素折叠成单个值。当你想要元组的字面形式时使用 str(),当你想要干净、可读的输出时使用其中一种元素组合方法。

用 str() 转换整个元组

内置的 str() 函数接受任何对象并返回其字符串表示形式。应用于元组时,它一次性转换整个容器并保留其语法——括号以及字符串元素周围的引号会成为结果的一部分。

运行以下示例:

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

my_tuple = (1, 2, 3, 'Hello', 'World')
tuple_as_string = str(my_tuple)
print(tuple_as_string)

输出:

(1, 2, 3, 'Hello', 'World')

注意 'Hello' 和 'World' 周围的引号:结果展现的是元组本身的样貌,而不是其内容的简洁列表。将其存储在诸如 tuple_as_string 这样的描述性名称中——永远不要把它赋值给 str,否则会在程序的其余部分遮蔽内置函数。

用分隔符连接元组元素

join() 方法将一个字符串序列拼接为单个字符串。你在分隔符字符串上调用它,并把元组作为参数传入,这使得它成为每个元素都已经是字符串时的惯用选择。

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

my_tuple = ('Python', 'is', 'awesome')
tuple_as_string = ' '.join(my_tuple)
print(tuple_as_string)

输出:

Python is awesome

分隔符可以是任何内容。不含任何字符的分隔符会把元素直接粘合在一起,逗号、短横线或更长的字符串也都是有效的:

letters = ('P', 'y', 't', 'h', 'o', 'n')
print(''.join(letters))
print(', '.join(letters))

输出:

Python
P, y, t, h, o, n

有一条限制需要注意:join() 只接受字符串。如果给它一个包含数字或其他对象的元组,就会得到 TypeError,因此需要先转换这些元素,如下一节所示。

在连接之前先转换混合类型元组

真实数据常常混合多种类型,因此在连接之前要让每个元素先经过 str()。在 join() 中使用生成器表达式,可以用一行可读的代码完成这一操作:

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

my_tuple = (1, 2, 3, 'Hello', 'World')
tuple_as_string = ' '.join(str(item) for item in my_tuple)
print(tuple_as_string)

输出:

1 2 3 Hello World

每个项目都使用前面介绍过的同一个 str() 函数进行转换,因此整数、浮点数和其他对象都能干净地连接。诸如 [str(item) for item in my_tuple] 的列表推导式效果完全相同;生成器形式只是避免构建一个中间列表。这一转换步骤正是上文所述 TypeError 的修复方法——join() 永远不会看到非字符串值。

用循环构建字符串

循环需要更多代码,但能让你控制每一个环节:自行转换每个元素、精确决定分隔符的位置,并在过程中跳过或转换某些项目。在第一个元素之后的每个元素前面添加分隔符,可以避免末尾出现多余的字符:

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

my_tuple = ('Python', 3.9, 'is', 'great')
tuple_as_string = ''
for index, item in enumerate(my_tuple):
    if index:
        tuple_as_string += ' '
    tuple_as_string += str(item)
print(tuple_as_string)

输出:

Python 3.9 is great

enumerate() 提供每个元素的位置,因此空格只在元素之间添加。这种模式适合元素需要单独处理的元组——例如对数字取整、给某些值加引号或进行过滤——在这些场景中,普通的 join() 无法表达所需的逻辑。

使用 reduce() 作为替代方案

functools.reduce() 通过累积地应用一个双参数函数,将序列折叠为单个值。配合 operator.add 时,它每次拼接一对元素。该示例需要两个导入:

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

import functools
import operator

letters = ('t', 'u', 'p', 'l', 'e')
word = functools.reduce(operator.add, letters)
print(word)

输出:

tuple

reduce() 方法本身不会插入任何分隔符;要添加分隔符需要使用 lambda 或预先准备好的辅助函数,这很快就会变得比 join() 更难读。可以把它记作一种替代方案,但对于将元组转换为字符串这一任务,join()——配合用于混合类型的生成器表达式——几乎总是更清晰的工具。