Pythonで文字列を連結・結合(+演算子、joinなど)

Modified: | Tags: Python, 文字列

Pythonで、文字列strを連結・結合するには+演算子や+=演算子、format(), f文字列などを使う。

複数の文字列を連結・結合: +, +=演算子

+演算子で連結

+演算子を使って、文字列リテラル('...' or "...")および文字列の変数を連結できる。

s = 'aaa' + 'bbb' + 'ccc'
print(s)
# aaabbbccc

s1 = 'aaa'
s2 = 'bbb'
s3 = 'ccc'

s = s1 + s2 + s3
print(s)
# aaabbbccc

s = s1 + s2 + s3 + 'ddd'
print(s)
# aaabbbcccddd

+=演算子で連結

累算代入演算子である+=演算子も使える。左辺の文字列変数に右辺の文字列が連結され、代入・更新される。

s1 = 'aaa'
s2 = 'bbb'

s1 += s2
print(s1)
# aaabbb

文字列変数の末尾に文字列を追加したい場合は、文字列変数と任意の文字列リテラル(または別の文字列変数)を+=演算子で処理すればよい。

s = 'aaa'

s += 'xxx'
print(s)
# aaaxxx

文字列リテラルを連続して連結

単純に文字列リテラルを並べて書いてもその文字列リテラルが連結される。

s = 'aaa''bbb''ccc'
print(s)
# aaabbbccc

間にスペースがあってもバックスラッシュ\による改行(継続行と見なされる)があってもよい。

s = 'aaa'  'bbb'    'ccc'
print(s)
# aaabbbccc

s = 'aaa'\
    'bbb'\
    'ccc'
print(s)
# aaabbbccc

これを利用して長い文字列をコード中で複数行に改行して書くテクニックがある。

文字列の変数に対してはこの書き方はできない。

# s = s1 s2 s3
# SyntaxError: invalid syntax

数値と文字列の連結・結合: +, +=演算子, str(), format(), f文字列

+, +=演算子とstr()で連結

異なる型の+演算はエラーとなる。

s1 = 'aaa'
s2 = 'bbb'

i = 100
f = 0.25

# s = s1 + i
# TypeError: must be str, not int

数値(整数型intや浮動小数点型floatなど)と文字列を連結するには、数値をstr()で文字列型に変換してから+演算子(または+=演算子)で連結する。

s = s1 + '_' + str(i) + '_' + s2 + '_' + str(f)
print(s)
# aaa_100_bbb_0.25

format()またはf文字列で連結

ゼロ埋めや小数点以下の桁数など、数値の書式を変換したい場合は、format()関数か文字列メソッドformat()を使う。

s1 = 'aaa'
s2 = 'bbb'

i = 100
f = 0.25

s = s1 + '_' + format(i, '05') + '_' + s2 + '_' + format(f, '.5f')
print(s)
# aaa_00100_bbb_0.25000

s = '{}_{:05}_{}_{:.5f}'.format(s1, i, s2, f)
print(s)
# aaa_00100_bbb_0.25000

書式を指定せずに変数の値をそのまま文字列中に埋め込むことも可能。+演算子を使うよりもシンプルに書ける。

s = '{}_{}_{}_{}'.format(s1, i, s2, f)
print(s)
# aaa_100_bbb_0.25

書式の指定方法などの詳細は以下の記事を参照。

Python3.6以降はf文字列(f-strings)という仕組みが導入されている。format()よりもさらにシンプルに書ける。

s = f'{s1}_{i:05}_{s2}_{f:.5f}'
print(s)
# aaa_00100_bbb_0.25000

s = f'{s1}_{i}_{s2}_{f}'
print(s)
# aaa_100_bbb_0.25

文字列のリスト(配列)を連結・結合: join()

文字列メソッドjoin()を使うと、文字列のリストを一つの文字列に連結できる。

書き方は以下の通り。

'間に挿入する文字列'.join([連結したい文字列のリスト])

'間に挿入する文字列'join()メソッドを呼び出し、引数として[連結したい文字列のリスト]を渡す。

空文字列''を使えば[連結したい文字列のリスト]が単純連結されるし、カンマ,を使えばカンマ区切りの文字列となり、改行文字\nを使えば文字列要素ごとに改行される。

l = ['aaa', 'bbb', 'ccc']

s = ''.join(l)
print(s)
# aaabbbccc

s = ','.join(l)
print(s)
# aaa,bbb,ccc

s = '-'.join(l)
print(s)
# aaa-bbb-ccc

s = '\n'.join(l)
print(s)
# aaa
# bbb
# ccc

なお、ここではリストの例のみを挙げたが、タプルなど他のイテラブルオブジェクトも同様にjoin()の引数に指定できる。

join()とは反対に特定の区切り文字で区切られた文字列を分割してリストとして取得するにはsplit()を使う。詳細は以下の記事を参照。

数値のリスト(配列)を文字列として連結・結合: join(), str()

join()の引数に文字列以外を要素とするリストを指定するとエラーとなる。

l = [0, 1, 2]

# s = '-'.join(l)
# TypeError: sequence item 0: expected str instance, int found

数値のリストをひとつの文字列に連結したい場合は、リスト内包表記で各要素にstr()関数を適用して数値を文字列に変換してからjoin()で連結する。

s = '-'.join([str(n) for n in l])
print(s)
# 0-1-2

リスト内包表記のジェネレータ版であるジェネレータ式でも書ける。ジェネレータ式は丸括弧()で囲むが、ジェネレータ式を関数やメソッドの唯一の引数とする場合は()を省略できる。

s = '-'.join((str(n) for n in l))
print(s)
# 0-1-2

s = '-'.join(str(n) for n in l)
print(s)
# 0-1-2

なお、一般的にジェネレータ式はリスト内包表記に比べてメモリ使用量が抑えられるといったメリットがあるが、join()は内部の処理でジェネレータをリストに変換するのでジェネレータ式を使うメリットは特にない。むしろ最初からリスト内包表記を使ったほうが若干速いとのこと。

リスト内包表記やジェネレータ式についての詳細は以下の記事を参照。

関連カテゴリー

関連記事