HOWTO · Python
Python で文字列をリストに変換する
Python では list()、split()、ast.literal_eval()、リスト内包表記を使って文字列をリストに変換できます。
このページの内容
結果の各要素が何であるべきかに応じて方法を選びます。文字ごとに 1 要素にするなら list(text)、単語や区切り値なら text.split()、すでに Python リテラルを表す信頼できるテキストなら ast.literal_eval(text)、要素ごとにフィルタや変換が必要ならリスト内包表記を使います。完全に制御できない入力に eval() を使わないでください。任意の Python コードを実行してしまう可能性があります。
list() で文字列を文字に変換する
list() は文字列を反復するため、Unicode 文字ごとに 1 つのリスト要素を作ります。文を単語に分割するわけではありません。
text = "Hello"
characters = list(text)
print(characters)
出力:
['H', 'e', 'l', 'l', 'o']
文字単位の処理が目的のときに使います。空文字列は [] になり、空白や句読点も区切りではなく文字として残ります。
split() で単語や値を分割する
任意の空白で区切られた単語には、引数なしで split() を呼び出します。連続する空白は 1 つの区切りとして扱われ、先頭と末尾の空白は無視されます。入力形式が区切り文字を定義している場合は、明示的に渡します。
sentence = "Convert this string to a list"
words = sentence.split()
print(words)
出力:
['Convert', 'this', 'string', 'to', 'a', 'list']
カンマ区切りのデータでは split(",") を使い、カンマの後に空白が許されるなら各フィールドに strip() を適用します。
text = "red, green, blue"
colors = [item.strip() for item in text.split(",")]
print(colors)
出力:
['red', 'green', 'blue']
明示的な区切り文字では空のフィールドも保持され、区切り文字が無い場合は文字列全体が 1 要素になります。引用符付きカンマを含む CSV なら、split() を拡張するのではなく Python の csv モジュールを使います。
最初のいくつかの区切りだけを境界にしたいときは maxsplit を使います。たとえば maxsplit=1 では残りが 2 番目の要素に入ります。
text = "red,green,blue"
first_two = text.split(",", maxsplit=1)
print(first_two)
出力:
['red', 'green,blue']
リストを表すテキストを解析する
文字列が "[1, 2, 3]" のような Python リテラル表現なら、ast.literal_eval() を使います。任意の式を実行するのではなくリテラルとコンテナを受け付けますが、それでも有効で信頼できる形式が必要で、不正なテキストでは ValueError や SyntaxError を送出することがあります。
import ast
text = "[1, 2, 3]"
values = ast.literal_eval(text)
if not isinstance(values, list):
raise TypeError("expected a list literal")
print(values)
出力:
[1, 2, 3]
解析に成功したからといって常にリストだとは限りません。"(1, 2)" のような文字列はタプルになるため、型チェックが役立ちます。JSON テキストには json.loads() を使います。Python リテラル構文と JSON は似ていますが同一ではありません。信頼できない入力で literal_eval() を eval() に置き換えないでください。
内包表記で変換または抽出する
数字だけを残す、大文字小文字を変えるなど、変換に規則が含まれるときに内包表記を使います。
text = "P y 3"
digits = [char for char in text if char.isdigit()]
print(digits)
出力:
['3']
各要素を変換することもできます。例: [char.lower() for char in text if char.isalpha()]。先に split() を呼ばなければ文字を対象にするので、単語を正規化したいときは両者を組み合わせます。
適切な方法を選ぶ
文字には list()、既知の区切りには split()、検証済みの Python リテラル形式には ast.literal_eval()、フィルタや変換には内包表記を使います。解析前に外部入力を検証し、元データが CSV や JSON なら形式専用のパーサーを選びます。これらの区別により、単語が欲しいのに文字リストになる、あるいはデータであるべき入力を実行してしまう、といったよくある誤りを防げます。