HOWTO · Python
如何在 Python 中將字串轉換為列表
了解何時使用 list()、split()、ast.literal_eval() 與列表推導式,將 Python 字串轉為字元、單字、分隔欄位或經檢查的列表資料。
本頁內容
請依照結果中每個項目應代表什麼來選擇方法。每個字元各自成為一項時,使用 list(text);要取得單字或以分隔符分開的值時,使用 text.split();文字已是可信的 Python 字面值表示時,使用 ast.literal_eval(text);要篩選或轉換項目時,使用列表推導式。不要對無法完全控制的輸入使用 eval(),因為它可能執行任意 Python 程式碼。
本文中的程式碼範例未於本次工作中執行;以下行為說明依據 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模組。 - 項目還需要篩選或轉換時,使用列表推導式。
轉換前先確認輸入格式提供了哪些保證。在外部文字進入程式的邊界處,驗證結果型別和必要欄位,並以呼叫端能妥善處理的方式回報格式錯誤。