Pythonでリストに格納された複数の文字列を、ひとつの文字列として結合したい場面は頻繁に発生します。例えば、CSVデータを作成するためにカンマで区切って結合したり、単語のリストをスペースで繋いで文章にしたりする場合です。
このような処理には、文字列型のメソッドである join() を使用します。+ 演算子を使ってループで結合する方法もありますが、join() を使う方がパフォーマンス(処理速度)の面で圧倒的に有利であり、コードも簡潔になります。
この記事では、join() メソッドの基本的な使い方と、リスト内に数値が含まれる場合の注意点について解説します。
join() メソッドの基本構文
join() メソッドは、リストではなく**「区切り文字(セパレータ)」**に対して呼び出します。これが初心者にとって少し直感的でない部分かもしれません。
構文:
"区切り文字".join(リストなどのイテラブル)
引数として渡されたリストの各要素の間に、指定した区切り文字を挟んで連結します。
具体的な使用例
1. スペースや記号で連結する
単語のリストをスペースで繋いで文章にしたり、ハイフンで繋いでIDを作成したりする例です。
# 単語のリスト
word_list = ["Python", "is", "very", "useful"]
# 半角スペースで連結
sentence = " ".join(word_list)
print(f"元のリスト: {word_list}")
print(f"連結結果: {sentence}")
# ハイフンで連結
id_parts = ["user", "001", "tokyo"]
user_id = "-".join(id_parts)
print(f"ID: {user_id}")
実行結果:
元のリスト: ['Python', 'is', 'very', 'useful']
連結結果: Python is very useful
ID: user-001-tokyo
2. 区切り文字なしで連結する(空文字)
リストの要素を隙間なく結合したい場合は、空文字列 "" に対して join() を呼び出します。
# 文字のリスト
char_list = ["P", "r", "o", "g", "r", "a", "m"]
# そのまま連結
combined_text = "".join(char_list)
print(f"結合後: {combined_text}")
実行結果:
結合後: Program
3. カンマで連結する(CSV形式)
データ分析などでよく使われるCSV(カンマ区切り)形式の文字列を作成する例です。
# CSVの1行分となるデータ
csv_row_data = ["2025-12-01", "Item-A", "In Stock"]
# カンマで連結
csv_line = ",".join(csv_row_data)
print(f"CSV行: {csv_line}")
実行結果:
CSV行: 2025-12-01,Item-A,In Stock
注意点:リストに数値が含まれる場合 (TypeError)
join() メソッドの引数となるリストは、**すべての要素が文字列(str)**でなければなりません。もし整数(int)などが含まれていると TypeError が発生します。
# 数値が含まれるリスト
number_list = [10, 20, 30]
# エラーになる例
# result = ",".join(number_list)
# TypeError: sequence item 0: expected str instance, int found
対処法:map() 関数で文字列に変換する
数値リストを連結したい場合は、map() 関数を使って全ての要素を str 型に変換してから join() に渡します。
# 数値リスト
scores = [98, 75, 80, 100]
# map(str, scores) で各要素を文字列に変換してから連結
score_csv = ",".join(map(str, scores))
print(f"スコアCSV: {score_csv}")
実行結果:
スコアCSV: 98,75,80,100
リスト内包表記 [str(x) for x in scores] を使う方法もありますが、単に変換するだけであれば map() の方が記述が簡潔で、メモリ効率も良くなります。
まとめ
- 文字列リストを連結するには
"区切り文字".join(リスト)を使用します。 +演算子のループよりも高速で効率的です。- 区切り文字なしで結合する場合は
"".join(リスト)とします。 - リスト内に数値が含まれる場合は
map(str, リスト)を使って文字列に変換する必要があります。
