[解決!Python]文字列を結合するには解決!Python

結合演算子/累算代入演算子/文字列のjoinメソッドを使って、複数の文字列を結合(連結)する方法を紹介。文字列以外を要素とするリストの要素を文字列として結合する方法も取り上げる。

» 2020年11月13日 05時00分 公開
[かわさきしんじDeep Insider編集部]

この記事は会員限定です。会員登録(無料)すると全てご覧いただけます。

「解決!Python」のインデックス

連載目次

# 結合演算子「+」を使う
first = 'shinji'
last = 'kawasaki'
name = first + ' ' + last  # 文字列変数とリテラル文字列と文字列変数の結合
print(name)  # 'shinji kawasaki'

# 累算代入演算子「+=」を使う
name = 'shinji'
name += ' ' + 'kawasaki'
print(name)  # 'shinji kawasaki'

# 文字列のjoinメソッドを使う
somestr = 'one, two, three'
strlist = somestr.split(', ')
print(strlist)  # ['one', 'two', 'three']
result = '_'.join(strlist)  # 区切りを'_'として['one', 'two', 'three']を結合
print(result)  # one_two_three

# 区切り文字が必要なければ空文字列に対してjoinメソッドを呼び出す
result = ''.join(strlist)
print(result)  # onetwothree

# 数値を要素とするリストから、それらを文字列化して結合
nums = list(range(5))  # [0, 1, 2, 3, 4]
result = ', '.join([str(x) for x in nums])
print(result)  # '0, 1, 2, 3, 4'


結合演算子「+」

 文字列(リテラル文字列または文字列を代入した変数)は結合演算子「+」で結合できる。

first = 'shinji'
last = 'kawasaki'
name = first + ' ' + last  # 文字列変数とリテラル文字列と文字列変数の結合
print(name)  # 'shinji kawasaki'


 このとき、被演算子には文字列のみを指定可能なことには注意すること。数値と文字列を(文字列として)結合するには、数値を文字列に変換しておく必要がある。

one = '1'
two = 2
ans = one + two  # TypeError

ans = one + str(two)
print(ans)  # '12'


 余談だが、Pythonの哲学を示した「PEP 20 -- Zen of Python」には「Explicit is better than implicit」というフレーズが含まれている。これは「暗黙的であるよりも明示的である方がよい」といった意味である。上に示した文字列と数値の連結(加算)はまさに暗黙的よりも明示的であることが望ましい場面といえる。

 上の「one + two」という式は、文字列を数値に変換して数値の加算をしたいのか、それとも数値を文字列に変換して文字列の結合をしたいのかは分からない(プログラマーの意図次第だ)。このような意味があいまいなコードにぶつかったときに、言語が(その仕様に則って)暗黙的に処理をしてしまうのではなく、プログラマーが何をしたいのかをハッキリとコードに残すことで、当て推量の余地がない可読性が高いコードとなり、他の人(または数日後、数年後の自分)にもその意味が伝わる。

 そして、Pythonでは「暗黙的よりも明示的」という哲学を守るための一環として、文字列と数値の演算を認めないように制約を設けることで、「one + two」のようなあいまいなコードが書けなくなり、プログラマーは上のコード例の「one + str(two)」のようにそのコードの意味を明示することになる。

累算代入演算演算子「+=」を使う

 文字列を代入した変数については累算代入演算子の「+=」を使って、その文字列の末尾に他の文字列を結合させることもできる。

name = 'shinji'
last = 'kawasaki'
name += ' ' + last
print(name)  # 'shinji kawasaki'


 この例では、変数nameには文字列'shinji'と空白文字、文字列'kawasaki'を結合してできた新しい文字列が代入される。Pythonでは文字列は変更不可能なオブジェクトなので、元の文字列そのものの末尾に「+=」の右辺の値が追加されるわけではないことは覚えておこう。

name = 'shinji'
last = 'kawasaki'
print(id(name))  # 140474281267952など
name += ' ' + last
print(id(name))  # 140474281269488など(上の値とは異なるものになるはず)


 このコードでは「+=」で文字列を結合する前後でそのID値を表示している(多くの人が使っているPython実装の「CPython」では、この値はそのオブジェクトがメモリ中で存在しているアドレスとなる)。2つの値は結合前後で異なるものになるはずだ。

joinメソッドによる文字列の結合

 「[解決!Python]splitメソッドで文字列を分割するには」では、文字列をsplitメソッドで分割する方法を紹介した。この結果は文字列を要素とするリストとなる。これを逆に文字列へと結合するには文字列のjoinメソッドを使用できる。

 joinメソッドの使い方は次のようになる。

'結合時の区切りとなる文字列'.join(文字列リスト)


 joinメソッドは、「結合時の区切りとなる文字列」に対して呼び出す。結合したい文字列を含んだリスト(または文字列を格納する反復可能オブジェクト)はその引数に指定する。これにより、リストに格納された個々の文字列が、それらの間に「結合時の区切りとなる文字列」を挟み込む形で結合される。

 以下に例を示す。

somestr = 'one, two, three'
strlist = somestr.split(', ')
print(strlist)  # ['one', 'two', 'three']
result = ', '.join(strlist)
print(result)  # one, two, three


 この例では、カンマ「,」と空白文字を区切り文字とした文字列'one, two, three'をsplitメソッドで分割して、今度はそれを「, 」を区切り文字としてjoinメソッドを呼び出して、分割された文字列を元の同じ文字列へと結合している。

 区切り文字が必要なければ、空文字列に対してjoinメソッドを呼び出せばよい。以下はその例だ。

nums = '01234'
strlist = list(nums)  # list関数で文字列の要素をバラしてリストに格納
print(strlist)  # ['0', '1', '2', '3', '4']
result = ''.join(strlist)
print(result)  # '01234'


 joinメソッドでは、数値を要素とするリストを基に、その要素を文字列として結合することはできない。

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。