Pythonで文字列を連結または結合する方法: +演算子、join, format, f文字列など

287, 2021-07-09

目次

Pythonで文字列を連結・結合する

Pythonで文字列を連結・結合するには+演算子や+=演算子、join(), format()などを使います。
これらの演算子やメソッドを使うことで文字列を連結したり結合することが可能です。

結論から言うとPythonで文字列を連結・結合するには↓のようにします。

s = 'Hello, '
result = s + 'World!'  # +演算子で結合
print(result)
# Hello, World!


s = 'Hello, '
s += 'World!'  # +=演算子で連結
print(s)
# Hello, World!


lis = ['2100', '01', '01']
s = '-'.join(lis)  # join()で結合
print(s)
# 2100-01-01


s = 'Hello'
result = '{}, World!'.format(s)  # format()で連結
print(result)
# Hello, World!


s = 'Hello'
result = f'{s}, World!'  # f文字列で連結
print(result)
# Hello, World!

この記事ではPythonによる文字列の連結または結合する方法を具体的に解説します。
具体的には↓を見ていきます。

  • +演算子による結合

  • +=演算子による結合

  • join()による結合

  • format()による結合

  • f文字列による結合

関連記事
Pythonで文字列抽出【インデックスとスライス】
Pythonで文字列を複数の区切り文字で分割(re.split)

+演算子による結合

Pythonの文字列(str)は+演算子で結合することができます。
文字列同士を+演算子で演算することで結合できます。

s = 'Hello, ' + 'World!'
print(s)
# Hello, World!

文字列を変数に保存した場合も、+演算子で結合できます。

s1 = 'Hello, '
s2 = 'World!'
s3 = s1 + s2
print(s3)
# Hello, World!

文字列以外のオブジェクト(f文字列を除く)とは連結できません。
たとえば文字列とNoneオブジェクトを連結しようとすると↓のようにエラーになります。

try:
    s = 'Hello, ' + None
except TypeError as e:
    print(e)
    # can only concatenate str (not "NoneType") to str

↑の「can only concatenate str (not "NoneType") to str」は和訳すると「文字列に連結できるのは文字列(Noneじゃない)だけです」となります。

NoneオブジェクトやTrue, Falseなどのオブジェクトを文字列に連結させたい場合は、これらのオブジェクトをstr()に渡します。
str()にオブジェクトを渡すとそのオブジェクトは文字列に変換されます。よって文字列と連結することが出来ます。

s = 'Hello, ' + str(None)
print(s)
# Hello, None

s = 'Hello, ' + str(True)
print(s)
# Hello, True

s = 'Hello, ' + str(False)
print(s)
# Hello, False

+=演算子による結合

+=演算子を使うと文字列に別の文字列を連結することができます。

s = 'Hello, '
s += 'World!'
print(s)
# Hello, World!

Pythonの文字列はイミュータブルなので↑のような連結は直感とはやや反するかもしれません。
これは変数内に保存されているオブジェクトの変数ごとのすげ替えが起こっているためです。
これはid()でアイデンティティを確認するとわかります。

s = 'Hello, '
print(id(s))
# 140656086881136

s += 'World!'
print(id(s))
# 140656085968880

id()で取得できるアイデンティティの値は変数(PyObject)のポインタの値です。
つまり↑のコードでは+=演算子で加算代入を行うことで変数自体のすげ替えが起こっていると言えます。
ちなみにこれは文字列だけでなく整数でも同様です。
Pythonの+=演算子はインプレース(in-place)演算子の一種で、これはたとえば

x += y

という演算は

x = operator.iadd(x, y)

という式と等価になります。
そのため+=による加算代入によってxのアイデンティティが新しく更新されるということになります。

join()による結合

文字列のメソッドをjoin()を使うと、文字列とリスト等に保存されている文字列を結合するすることができます。

関連記事
Pythonのjoinで文字列を結合する

使い方は↓の通りです。

文字列.join(イテラブルオブジェクト)

文字列とリストの文字列を結合するには↓のようにします。

s = '-'.join(['2100', '01', '01'])
print(s)
# 2100-01-01

↑のように文字列がリストの中の文字列のセパレーターとして連結されます。
↑の場合、文字列は-ですが、これが21000101などの文字列の区切り文字として連結されています。

文字列とタプルの文字列を結合するには↓のようにします。

s = ','.join(('Alice', 'Bob', 'Taro'))
print(s)
# Alice,Bob,Taro

文字列とジェネレーターを結合するには↓のようにします。

g = (str(i) for i in range(3))
s = '-'.join(g)
print(s)
# 0-1-2

いずれの場合もリストなどの要素は文字列である必要があります。
文字列でなかった場合は↓のようなエラーになります。

try:
    '-'.join([None])
except TypeError as e:
    print(e)
    # sequence item 0: expected str instance, NoneType found

↑のエラーを和訳すると「文字列のオブジェクトを期待しましたが、Noneが見つかりました」となります。

format()による結合

文字列のメソッドformat()を使うと、文字列の中に文字列を連結させることが出来ます。

format()は↓のように使います。

文字列.format(引数)

たとえば文字列に別の文字列s1を連結させたい場合は↓のようにします。

s1 = 'Hello'
s2 = '{}, World!'.format(s1)
print(s2)
# Hello, World!

↑の場合、「{}, World!」という文字列にs1の文字列が連結されています。
連結される場所は{}が書かれている部分です。この部分にs1がぶち込まれて新しく文字列が生成されます。

ぶち込まれてって

乱暴なかたね

{}は複数使うことが出来ます。その場合、文字列の先頭から引数の順番で埋め込まれていきます。

s1 = 'Hello'
s2 = 'World'
s3 = '{}, {}!'.format(s1, s2)
print(s3)
# Hello, World!

キーワード引数を埋め込むこともできます。
その場合は↓のようにします。

s1 = 'Hello'
s2 = 'World'
s3 = '{one}, {two}!'.format(one=s1, two=s2)
print(s3)
# Hello, World!

↑の場合、{one}という部分にs1が、{two}という部分にs2が埋め込まれます。
キーワード引数を使う場合は引数の順番は順不同でもOKです。

s1 = 'Hello'
s2 = 'World'
s3 = '{one}, {two}!'.format(two=s2, one=s1)
print(s3)
# Hello, World!

f文字列による結合

format()と役割が似ていますが、Pythonにはf文字列(フォーマット済み文字列リテラル)というものがあり、これを使っても文字列を連結・結合することが出来ます。

f文字列は↓のように使います。

f文字列

たとえば文字列の中に文字列s1を埋め込みたい場合は↓のようにします。

s1 = 'Hello'
s2 = f'{s1}, World!'
print(s2)
# Hello, World!

↑の場合「f'{s1}, World!'」というのがf文字列です。
{s1}で文字列s1を埋め込んでいます。
その結果はs2で返ってきて、中身は「Hello, World!」になります。

f文字列の中には↓のように複数の文字列を埋め込むことが出来ます。

s1 = 'Hello'
s2 = 'World'
s3 = f'{s1}, {s2}!'
print(s3)
# Hello, World!

おわりに

今回はPythonの文字列の連結・結合について見てみました。
文字列の連結・結合はPythonでは頻出の処理かと思います。

連結して結合しよう

お、おう……