HOWTO · Python
Python でリストを文字列に変換する方法
このチュートリアルでは、Python でリストを文字列に変換する方法を紹介します
このページの内容
リストを1つの文字列にするには、区切り文字に対してjoin()を呼び出し、文字列のリストを渡します。区切り文字は隣り合う要素の間に挿入され、先頭の前や末尾の後には付きません。数値や型が混在する値を扱う場合は、各要素を先に文字列へ変換します。最後の組み立てにはjoin()を使い、内包表記、map()、またはループで要素を準備します。
文字列のリストをjoin()で結合する
次の例を実行します。コード内の表示ラベルと出力は、元の内容を保つため英語のままです。
words = ["Hello", "World", "from", "Python"]
print("".join(words))
print(" ".join(words))
この例では、2種類の区切り文字を使っています。空の区切り文字では文字列がそのまま連結され、空白の区切り文字では各要素の間にスペースが1つ入ります。", "、"-"、" | "など、任意の文字列を区切り文字にできます。要素自体は変更されません。
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)
どちらの方法でも、join()で結果を組み立てる前に、各数値をstr()で変換します。読者にとって変換処理が分かりやすい形式を選んでください。どちらの方法も元のリストは変更しません。独自の変換を行う場合は、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()で変換します。要素ごとの処理が分かりやすくなる場合はループを使い、多くの要素を組み立てる場合は一度だけ結合する方法を選びましょう。