Pythonで文字列を連結・結合(+演算子、joinなど)
Pythonでの文字列操作において、文字列を連結・結合する方法として、
- 複数の文字列を連結・結合:
+
演算子,+=
演算子 - 数値と文字列を連結・結合:
+
演算子,+=
演算子,str()
,format()
- 文字列のリスト(配列)を一つの文字列に連結・結合:
join()
- 数値のリスト(配列)を一つの文字列に連結・結合:
join()
,str()
を説明する。
複数の文字列を連結・結合: +演算子, +=演算子
+演算子で連結
+
演算子を使って、文字列リテラル('...'
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 += s2
print(s1)
# aaabbb
文字列変数の末尾に文字列を追加したい場合は、文字列変数と任意の文字列リテラル(または別の文字列変数)を+=
演算子で処理すればよい。
s = 'aaa'
s += 'xxx'
print(s)
# aaaxxx
文字列リテラルを連続して連結
単純に文字列リテラルを並べて書いてもその文字列リテラルが連結される。
s = 'aaa''bbb''ccc'
print(s)
# aaabbbccc
間にスペースがあってもバックスラッシュ\
による改行(継続行と見なされる)があってもOK。
s = 'aaa' 'bbb' 'ccc'
print(s)
# aaabbbccc
s = 'aaa'\
'bbb'\
'ccc'
print(s)
# aaabbbccc
これを利用して長い文字列をコード中で複数行に改行して書くテクニックがある。
- 関連記事: Pythonで長い文字列を複数行に分けて書く
文字列の変数に対してはこの書き方はできない。
# s = s1 s2 s3
# SyntaxError: invalid syntax
数値と文字列の連結・結合: +演算子, +=演算子, str(), format()
異なる型の+
演算はエラーとなる。
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()
関数か文字列メソッドformat()
を使う。
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
書式の指定方法などの詳細は以下の記事を参照。
Python3.6以降はf文字列(f-strings)という仕組みも導入されている。format()
よりもシンプルに書ける。
文字列のリスト(配列)を連結・結合: 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()
は内部の処理でジェネレータをリストに変換するのでジェネレータ式を使うメリットは特にない。むしろ最初からリスト内包表記を使ったほうが若干速い。
リスト内包表記やジェネレータ式についての詳細は以下の記事を参照。
- 関連記事: Pythonリスト内包表記の使い方