HOWTO · Python

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

了解何时使用 list()、split()、ast.literal_eval() 和列表推导式,将 Python 字符串转换为字符、单词、分隔字段或经过验证的列表数据。

本页内容

应根据结果中每个元素的含义选择方法:需要每个字符各占一项时使用 list(text);需要单词或按分隔符划分的值时使用 text.split();要解析本身就是 Python 字面量的可信文本时使用 ast.literal_eval(text);要筛选或转换元素时使用列表推导式。不要对无法完全控制的输入调用 eval(),因为它可能执行任意 Python 代码。

使用 list() 将字符串转换为字符

list() 会遍历字符串,为每个 Unicode 码点生成一个元素。它不会把句子拆成单词。例如,组合重音符可能是独立的码点,即使显示时它看起来附着在字母上也是如此。

text = "Hello"
characters = list(text)
print(characters)

这种方法适用于逐字符处理。空格和标点也会作为字符保留;如果任务要求移除或转换它们,需要明确地进行处理。

使用 split() 拆分单词或值

不带参数调用 split() 时,会按一段连续的空白字符拆分单词。开头和结尾的空白会被忽略,多个空格、制表符或换行符会被视为同一个分隔符。

sentence = "Convert this string to a list"
words = sentence.split()
print(words)

如果输入使用已知分隔符,请显式传入该分隔符。如果逗号分隔的字段两侧可能有空格,可以在拆分后去除每个字段的首尾空白:

text = "red, green, blue"
colors = [item.strip() for item in text.split(",")]
print(colors)

显式指定分隔符时,空字段会保留下来:"red,,blue".split(",") 会在两个逗号之间包含一个空字符串。如果字符串中没有该分隔符,原字符串会作为唯一一项返回。使用 maxsplit 可以限制拆分次数;"red,green,blue".split(",", maxsplit=1) 会将 green,blue 保留为第二项。

split() 不是 CSV 解析器。如果字段中可能包含带引号的分隔符,例如 "red, bright",blue,应使用 Python 的 csv 模块,以便正确处理引号规则。

解析表示列表的文本

如果文本已经采用 Python 字面量语法,例如 "[1, 2, 3]",可以用 ast.literal_eval() 解析。它接受字面量和容器,不会执行任意表达式。文本仍必须符合语法;格式错误的输入可能引发 ValueError 或 SyntaxError。

import ast

text = "[1, 2, 3]"
values = ast.literal_eval(text)
if isinstance(values, list):
    print(values)
else:
    print("The parsed value is not a list")

解析成功并不代表结果一定是列表:例如,"(1, 2)" 表示一个元组。使用结果前应检查其类型;输入可能变化时,也要处理解析错误。对于 JSON 文本,应使用 json.loads(),因为 JSON 与 Python 字面量语法相似,却并不完全相同。应始终把输入当作数据;如果文本并非完全受控,绝不能用 eval() 代替 ast.literal_eval()。

使用列表推导式转换或筛选

列表推导式可以在构建结果时应用条件或转换。下面的例子只保留数字字符:

text = "P y 3"
digits = [char for char in text if char.isdigit()]
print(digits)

也可以转换保留下来的字符,例如使用 [char.lower() for char in text if char.isalpha()]。列表推导式遍历的是字符串中的字符。如果需要处理的是单词,应先调用 split(),再对得到的单词列表使用推导式。

选择合适的方法

  • 每个字符都应成为一项时,使用 list(text)。
  • 拆分由空白分隔的单词时使用 text.split();拆分分隔符固定且格式简单的字段时使用 text.split(separator)。
  • 只有当输入确实是 Python 字面量数据时才使用 ast.literal_eval();检查解析结果的类型,并处理格式错误的文本。
  • JSON 使用 json.loads();包含带引号 CSV 字段的数据使用 Python 的 csv 模块。
  • 需要筛选或转换元素时,使用列表推导式。

转换前先确认输入格式提供了哪些保证。在外部文本进入程序的边界处,验证结果类型和必需字段;对于格式错误的数据,应以调用代码能够处理的方式报告。