文字列

【Python】文字列を連結・結合する方法

【Python】文字列を連結・結合する方法

Pythonで文字列を連結・結合する方法について解説します。

文字列を連結・結合する方法

プログラミングでは、文字列をうまく扱うことは非常に重要です。文字列を扱う際には、文字列や文字列のリストを連結・結合したい場面に多く直面します。

本記事では、Pythonで文字列を連結・結合する方法について紹介します。

文字列を連結・結合する

複数の文字列を連結・結合する方法

複数の文字列を連結・結合する場合には、以下のように+演算子+=演算子文字列リテラルの列挙という方法があります。

s1 = "a"
s2 = "b"
s3 = "c"

# +演算子で文字列を連結・結合する
temp_str = s1 + s2 + s3
print(temp_str)

# +=演算子で文字列を連結・結合する
s4 = "d"
temp_str += s4
print(temp_str)

# 文字列リテラルを連続して列挙して連結・結合する
temp_str = "e" "f" "g"
print(temp_str)
【実行結果】
abc
abcd
efg

上記例のように複数の文字列を+演算子や+=演算子によって連結・結合できます。また、文字列リテラルを単純に並べるだけでも連結・結合することが可能です。文字列リテラルの列挙の場合は、間にスペースやバックスラッシュによる改行があっても問題ありません。

数値と文字列を連結・結合する方法

数値と文字列を連結・結合する場合には、単純に+演算子等を適用することができません。そのまま連結・結合しようとすると以下のようにTypeErrorエラーとなります。

s1 = "a"
n1 = 100

# そのまま連結・結合しようとするとエラーとなる
temp_str = s1 + "_" + n1
print(temp_str)
【実行結果】
TypeError: can only concatenate str (not "int") to str

このエラーを解決する方法を以下の例で見てみましょう。

s1 = "a"
n1 = 100

# +演算子で文字列と数値を連結・結合する
temp_str = s1 + "_" + str(n1)
print(temp_str)

# +=演算子で文字列を連結・結合する
n2 = 0.01
temp_str += "_"
temp_str += str(n2)
print(temp_str)

# formatを使用して連結・結合する
temp_str = "{}_{}".format(s1, n1)
print(temp_str)

# f-stringを使用して連結・結合する
temp_str = f"{s1}_{n1:05}_{n2:.5f}"
print(temp_str)
【実行結果】
a_100
a_100_0.01
a_100
a_00100_0.01000

上記例のようにstrを使うことで数値を文字列に変換してから+演算子等を使うことで、数値と文字列を結合することができます。

また、formatf-stringを使用して連結することで数値のフォーマットを変えつつ結合するといったことも可能です。formatf-stringについては「文字列のフォーマットを整える方法」にまとめていますので参考にしてください。

+演算子、+=演算子、文字列リテラルの列挙といった連結・結合方法は、少ない数の文字列の連結・結合においては可読性も高く、非常に適した対応方法です。しかし、結合の数が大規模になってくるとパフォーマンスが低下することがあります。このような時には、後述するリストのjoinメソッドを使用することが適切です。

リストを連結・結合して文字列にする方法

リストの文字列や数値を連結・結合して文字列にする場合には、strクラスのjoinメソッドを使用します。joinメソッドは、非常に効率的な連結・結合方法でPythonではよく用いられます。特に多くの文字列を連結・結合する場合には非常に効果的です。

文字列のリストを文字列に連結・結合する方法

joinメソッドで文字列のリストを連結・結合する場合は、以下のようにします。

sample_list = ["Pytho", "Java", "Go", "C", "C#"]

# 文字列をそのまま結合
print("".join(sample_list))

# 区切り文字でjoinで結合
print(",".join(sample_list))
【実行結果】
PythoJavaGoCC#
Pytho,Java,Go,C,C#

文字列を単純につなげたい場合は、空文字("")のjoinメソッドに対象リストを渡すことで結合することができます。

区切り文字を指定したい場合は、区切り文字の文字列のjoinメソッドに結合対象のリストを渡します。上記例は、","(カンマ)を区切り文字として結合した例ですが、もちろん他の区切り文字を使用することも可能です。

数値のリストを文字列に連結・結合する方法

数値のリストに対して、単純にjoinを適用すると以下のようにTypeErrorというエラーとなります。

sample_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 数値リストをjoinでそのまま連結することはできない
print(",".join(sample_list))
【実行結果】
TypeError: sequence item 0: expected str instance, int found

数値リストをjoinで結合する場合には、以下のように数値リストをstrで文字列に変換してからjoinメソッドに渡します。

sample_list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

# 数値リストをjoinで結合する場合はstrに変換してからjoinに渡す
print(",".join([str(i) for i in sample_list]))
【実行結果】
1,2,3,4,5,6,7,8,9,10

上記例のようにリスト内包表記を使ってまとめて作成すると簡単です。なお、リスト内包表記について理解が不十分な方は「リスト(list)内包表記の使い方」にまとめていますので参考にしてください。

異なる型のオブジェクトを含むリストを文字列に連結・結合する方法

上記では、文字列だけ含むリスト、数値だけ含むリストを中心に扱ってきましたが、Pythonでは異なる型のオブジェクトを含むリストを扱うことが可能です。

ほとんどの型ではstrにより文字列に変換をすることができるため、上記の数値の結合で使用した実装方法は、以下のように異なる型のオブジェクトを含むリストに適用できます。

class CustomClass1:
    pass


class CustomClass2:
    def __init__(self, value):
        self.value = value

    def __str__(self):
        return f"<CustomClass2 value={self.value}>"


# 様々な型が混在している場合
sample_list = [1, 2, "a", "b", CustomClass1(), CustomClass2(123), 8.0, 9.0]

# strで文字列に変換ができれば結合可能
print(",".join([str(i) for i in sample_list]))
【実行結果例】
1,2,a,b,<__main__.CustomClass1 object at 0x00000249B9E5A190>,<CustomClass2 value=123>,8.0,9.0

上記のsample_listでは、複数の型のオブジェクトを含んでいます。開発者が定義したようなカスタムクラスでも、自動的に__str__メソッドが提供されるためCustomClass1クラスでの「<main.CustomClass1 object at 0x00000249B9E5A190>」のように表示され、基本的には問題は起こりません。

また、CustomClass2では、開発者が__str__メソッドを個別に定義しています。上記例では文字列を適切に返却しているので問題は起こりませんが、仮にNoneを返すようなコードを書いてしまうとTypeErrorを発生させてしまう可能性がある点に注意してください。

上記のように異なる型を含むリストを扱う場合には、型チェックや例外処理を十分意識する必要があります。また、__str__を個別実装するような場合には、上記で説明したようにNone を返してしまったり、予期しない例外を発生させたりしないように十分注意し、利用者に伝わりやすい簡潔な文字列表現を返却するなど十分考慮するようにしてください。

まとめ

Pythonで文字列を連結・結合する方法について解説しました。

+演算子や+=演算子を使って単純に連結・結合する方法やリストを連結・結合するjoinメソッドについて例を使って使い方を説明しました。

少ない数の連結・結合では、+演算子や+=演算子を使った方が可読性も高く、非常に適していますが、数が大規模な場合にはより効率的に処理が可能なjoinメソッドを使用すること検討してください。

文字列を連結・結合するという場面はプログラミングにおいては頻繁に出てきます。是非使い方を覚えていただき効率よく文字列の連結・結合をしてもらえればと思います。

Note

str.joinの公式ドキュメントはこちらを参照してください。

類似した処理でファイルパスを組み立てたい場合については「ファイルパスを組み立てる方法」にまとめていますので参考にしてください。