Pythonのjoinで文字列を結合する

177, 2021-02-08

目次

Pythonのjoinで文字列を結合

こんにちは、現世を生き抜くソルジャーの皆さん。
プログラミング言語のPythonには文字列を扱うクラスstrがあるんですよ。

このstrには複数の文字列を結合するメソッドjoin()がありまして。
このstr.join()を使うとリストなどに保存されている文字列を1つの文字列に結合することが可能なんですね。

この記事ではjoin()について具体的に↓を見ていきたいと思います。

  • str.join()の構造

  • str.join()で文字列のリストを結合する

  • 非文字列の要素を結合する

  • 自作オブジェクトを結合する

str.join()の使用頻度はそれほど高くはないですが、知っておくといざという時に役に立ちますよ。

備えあれば憂いなしと言いますし・・・

str.join()の構造

str.join()は↓のような構造をしているんですね。

str.join(iterable)

まぁ単純な構造でして、1つの引数を取り、1つの文字列の返り値を返すという具合です。
どっちも1つと1つで、単純でしょ。わかりやすいですよね・・・・・・。

iterable(第1引数)

str.join()の第1引数ですが、これはイテレーション可能なオブジェクトを渡せます。
イテレーション可能なオブジェクト、というのはですね、まぁ要するにfor文で回せるオブジェクト、ってことになりますね。
イテレーション可能ならなんでもOKかと言うと、そうはいかなくてですね、要素のオブジェクトは文字列じゃないといけません。
非文字列のオブジェクトが含まれていたりすると、str.join()は怒ってTypeErrorを送出するんで、気をつけてくださいね・・・・・・。

返り値

返り値は文字列です。
これは結合された結果の文字列になります。
あなたの欲しかったものが、これってことになりますねぇ。
join()なんてタイプして、わざわざコードを書いたのも、この返り値が欲しいがゆえのたわむれ・・・・・・。
返り値を手に入れたらstr.join()にぺこりと一礼なんて、いいかもしれませんね、ええ。

str.join()で文字列のリストを結合する

それではですね、str.join()の基本的な使い方、見ていきましょうか。
まず文字列の入ったおいしそうなリストを用意しておきます。

lis = ['Ringo', 'Budo', 'Kaki']

フルーティーな香りのするリストですよ、いいでしょう。
おいしいおいしいリンゴ、ブドウ、柿・・・たまりませんねぇ。

それではですね、↑のリスト内の文字列を半角スペースで結合してみましょうか。
そうするにはですね、半角スペースにドットを打ってjoin()を呼び出し、その時にリストを渡せばいいんです。

lis = ['Ringo', 'Budo', 'Kaki']
s = ' '.join(lis)
print(s)

↑のコードを実行すると↓のような結果になります。

Ringo Budo Kaki

どうですか、結合できてますね。見事なもんでしょう。
え? 半角スペースじゃちょっとわかりづらい?
なるほど・・・たしかにたしかに。おっしゃる通りですねぇ。

ではハイフン(-)で結合してみましょうか。
↓のようにですね。

lis = ['Ringo', 'Budo', 'Kaki']
s = '-'.join(lis)
print(s)

↑のコードを実行すると↓のような結果になります。

Ringo-Budo-Kaki

どうです、今度はわかりやすいでしょう。
↑のようにstr.join()はですね、左右には文字を付加しないんですね。
間の文字列の隙間にい~感じに結合してくれるんです。よくできた子でしょう。

非文字列の要素を結合する

str.join()はですね、非文字列の要素が引数に含まれていたらTypeErrorを送出します。
その様子をちょっと見てみましょう。
↓のような整数の入ったリストを用意します。

lis = [5, 11, 7, 13, 11, 17]

ちなみにこの整数はですね、いわゆるセクシー素数というやつでして、普段ディスプレイを睨みっぱなしの紳士の皆様の目を癒す、エレガ~ントな素数になっております・・・・・・。
それでこの素数のリストをstr.join()に渡すとどうなるか、見てみましょう。

lis = [5, 11, 7, 13, 11, 17]
s = ' '.join(lis)
print(s)

↑のコードを実行すると↓のような結果になります。

Traceback (most recent call last):
  File "./sample.py", line 2, in <module>
    s = ' '.join(lis)
TypeError: sequence item 0: expected str instance, int found

ありゃりゃ、出ました、TypeErrorですね。
これが出るともう、やる気無くなっちゃいますよねぇ。
このようにstr.join()に非文字列の要素を渡すと、TypeErrorが送出されるんで、どうか気をつけてください。

もちろん、やりようはあります。
それは↓のようにしちゃえばいいんですね。

lis = [5, 11, 7, 13, 11, 17]
s = ' '.join([str(el) for el in lis])
print(s)

↑のようにリスト内包表記で要素を文字列に変換しちゃえば、結合も出来ちゃいます。
↑のコードを実行すると↓のような結果になります。

5 11 7 13 11 17

ちゃんと文字列として結合できてますね。
このように非文字列の要素も工夫すれば結合することは可能です。
ただし__str__()を実装していないオブジェクトなんかは注意が必要です。
文字列にしようにも、定義がないわけですからね。

ジェネレーターを結合する

str.join()の引数にはイテレーション可能なオブジェクトを渡せるんでした。
ということはつまり、はい、お察しの通りで、ジェネレーターも渡すことが出来ます。

実際にやってみたいとおもいます。
ジェネレーターを作るにはyieldを使った関数やメソッドを定義するのと、あとはジェネレーター式を使った方法があります。

yieldを使った関数は↓みたいな感じですね。

def gen():
    yield 'A'
    yield 'B'
    yield 'C'

g = gen()
print(g)

↑のコードを実行すると↓のような結果になります。

<generator object gen at 0x011CB5A0>

↑の関数で生成したジェネレーターをstr.join()で結合してみましょう。

def gen():
    yield 'A'
    yield 'B'
    yield 'C'

g = gen()
s = '-'.join(g)
print(s)

↑のコードを実行すると↓のような結果になります。

A-B-C

問題なく結合できてるのがわかりますね。
それではジェネレーター式を使ったパテーンも見てみましょう。

g = (str(i) for i in range(4))
s = '-'.join(g)
print(s)

↑の(str(i) for i in range(4))ってのがジェネレーター式の部分です。
この式はジェネレーターを生成します。
内容的には0から4より下までfor文を回し、その添え字をyieldしてるってな具合です。
↑のコードを実行すると↓のような結果になります。

0-1-2-3

はい、問題なく結合できてますね。

自作オブジェクトを結合する

str.join()に渡せるのはイテレーション可能なオブジェクトなんですが、自作のクラスも渡すことが出来ます。
具体的には自作のクラスの__iter__()メソッドを定義すれば、str.join()に渡せるようになります。

ためしに↓のようなクラスを作ってみます。

class MyList:
    def __iter__(self):
        yield 'A'
        yield 'B'
        yield 'C'

↑のクラスをオブジェクトにしてstr.join()に渡します。

class MyList:
    def __iter__(self):
        yield 'A'
        yield 'B'
        yield 'C'

lis = MyList()
s = '-'.join(lis)
print(s)

↑のコードを実行すると↓のような結果になります。

A-B-C

ちゃんと結合できてますね。
ここまで来ると、もはや何でもあり? って感じになりますが、Pythonは何でもありありということで・・・・・・。

おわりに

いかがでしたでしょうか・・・今回はstr.join()を紹介しました。
非文字列を渡すとヒステリーを起こすところがちょっとかわいいメソッドですが、使いようによっては非常に便利に使えるかと思います。
どうぞ可愛がってあげてくださいね・・・・・・。

では、また今度お会いするまで楽しみにしております・・・・・・