Pythonのjoinで文字列を結合する
- 作成日: 2021-02-08
- 更新日: 2023-12-24
- カテゴリ: Python
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()
を紹介しました。
非文字列を渡すとヒステリーを起こすところがちょっとかわいいメソッドですが、使いようによっては非常に便利に使えるかと思います。
どうぞ可愛がってあげてくださいね・・・・・・。
🦝 < では、また今度お会いするまで楽しみにしております・・・・・・