Pythonのjoinメソッドを使うと、リストやタプルの中の文字列データを手軽に連結して一つの文字列にすることができます。ここでは、実際に様々なリストや辞書、集合の中の文字列データをjoinメソッドで連結していきながら、使い方を詳しく解説していきます。
ぜひ参考にして頂ければと思います。
1. Pythonのjoinメソッドの使い方
joinメソッドは、文字列に対して使うことができるメソッドです。これを使うと、リストやタプル、辞書、集合の中の文字列データを連結することができます。
joinメソッドは次のように使います。
''' joinメソッドの基本書式 '''
文字列型オブジェクト(区切り文字).join(イテラブル)
「文字列型オブジェクト」とありますが、オブジェクトについては「オブジェクト指向プログラミング」を学習する段階でより深く理解できるようになります。まだそこまで学習が進んでいない場合は、「文字列型オブジェクト = 文字列 or 文字列が入った変数」と理解すれば十分ですので小難しく考える必要はありません。joinメソッドでは、この「文字列型オブジェクト」は区切り文字を設定するために使います。
「イテラブル」とは、その中のデータを順番に取り出すことができるオブジェクトのことです。これも、単純に「イテラブル = リストやタプル、辞書、集合」と理解すれば十分です。
小難しく聞こえますが、使い方を見ると、すぐに使い方が分かるのでご安心ください。それでは、これから一緒に実際の使い方を見ていきましょう。
1.1. pythonのlistをjoinメソッドで連結
それではリストの中の文字列データをjoinメソッドで連結してみましょう。次のコードをご覧ください。
''' リストを作ります。 '''
str = '' # 空の文字列(= 区切り文字なし)
list = ['a', 'b', 'c']
''' joinメソッドでリストのデータを連結して文字列にします。 '''
print(str.join(list))
''' 戻し値は文字列型(str型)です。 '''
print(type(str.join(list)))
listの中の文字列 [‘a’, ‘b’, ‘c’]が連結してabcと出力されました。
詳しく解説しますね。
まず「str=”」で空の文字列を代入した文字列変数strを作っています。次に、「list=[‘a’, ‘b’, ‘c’]」で3つの文字列データをもつリストを作っています。joinメソッドは文字列メソッドなので、先頭は必ず文字列です。そのため「str.join()」と書きます。そして、メソッドの括弧()の中の引数に結合したい文字列データを含むイテラブルを書きます。そのため「str.join(list)」と書きます。ここで使った文字列は空の文字列なので、変数listの中の文字列データ[a, b, c]が、区切り文字なしで連結されて’abc’となります。
なおtype関数で確認している通りjoinメソッドの戻り値は文字列型です。type関数については『Pythonの変数の型を調べる方法』をご覧ください。
さて、joinメソッドの先頭につける文字列は変数である必要はありません。次のコードでは、joinメソッドの前に空の文字列(”)を直接渡しています。むしろ、こちらの方がよく使うことになると思います。
''' 文字列は変数である必要はありません。'''
print(''.join(list))
イテラブルの中の文字列データを連結する時に任意の区切り文字を入れたい場合は、次のように書きます。区切り文字を’ and ‘にしたものと’+’にしたものです。
''' 具体的にはイテラブルのデータを任意の区切り文字を入れて連結したい時に使います。 '''
# 次のリストのデータを連結して文字列にしたいとします。
list = ['Tom', 'Jerry']
# このリストのデータを区切り文字 and を入れて連結します。
print(' and '.join(list))
# このリストのデータを区切り文字+を入れて連結します。
print('+'.join(list))
このように、joinメソッドはイテラブルの中の文字列データを、好きな区切り文字を入れて連結してくれるメソッドです。
もしjoinメソッドがなかったら、イテラブルの中の文字列データを連結するには、for文を使って、次のように書かなくてはいけません。
''' 余談ですが、もしjoinメソッドがなかったらイテラブルのデータを連結するコードはこんなに長くなります。 '''
list = ['a', 'b', 'c', 'd', 'e']
new_list = '' # 空の文字列
for i in list:
new_list += i
print(new_list)
joinメソッドの方がはるかに便利ですね。
ただし、joinメソッドはイテラブルの中の文字列データを連結するものです。文字列以外のデータをもつイテラブルに対して使うと、次のようにタイプエラーになりますのでご注意ください。
''' joinメソッドは文字列を連結するものなのでデータが文字列以外の場合はエラーになります。 '''
#データが数値のイテラブル
list = [1, 2, 3]
print(', '.join(list))
文字列以外のデータを含むイテラブルをjoinメソッドで結合したい場合は、map関数を併用する必要があります。map関数を使った例を解説する前に、joinメソッドをリスト以外のイテラブルにも使ってみましょう。
1.2. pythonのtupleをjoinメソッドで連結
タプルの中の文字列データはリストの場合と全く同じようにjoinメソッドで連結することができます。
''' タプルのデータもリストと同じように連結して文字列にすることができます。 '''
# タプルを作ります。
tuple = ('a', 'b', 'c')
# カンマを区切り文字にして連結しましょう。
new_tuple = ', '.join(tuple)
print(new_tuple)
これについては特に解説は必要ありませんね。
1.3. pythonのdictをjoinメソッドで連結
辞書のキーが文字列の場合、joinメソッドで、キーを連結することができます。
''' joinメソッドは辞書のキーも連結することができます。'''
#辞書のキーを連結して文字列にします。
dict1 = {'mat':1, 'sheet':2}
str1 = '->'
print(str1.join(dict1))
#ただし辞書のキーが数値の場合はタイプエラーになります。
dict2 = {1:'mat', 2:'sheet'}
str2 = ', '
print(str2.join(dict2))
このようにキーが文字列の辞書(dict1)では、それらを連結することができていますが、キーが文字列ではない辞書(dict2)では、タイプエラーになっています。
1.4. pythonのsetをjoinメソッドで連結
集合もイテラブルなので、joinメソッドで連結することができます。次のコードをご覧ください。
''' joinメソッドでset(集合)も連結することができます。'''
#文字列のset(集合)を連結して文字列にします。
set1 = {'1', '2', '3'}
str1 = ', '
print(str1.join(set1))
#もう一つ見てみましょう。
set2 = {'Python', 'Ruby', 'Java'}
str2 = ', '
print(str2.join(set2))
#set(集合)の要素が文字列でない場合はタイプエラーになります。
set3 = {1, 2, 3}
str3 = ' ->-> '
print(str3.join(set3))
まず、集合の場合はリストやタプルと違って、その中のデータの配置は順不同です。そのため、joinメソッドで連結したら、中のデータは配置の順番通りに連結されるわけではないことをご確認ください。
また、もちろん集合の場合も、joinメソッドは、データが文字列ではない場合はタイプエラーになります。
2. joinメソッドで数値を文字列化して連結する方法(map関数)
先ほども少し触れましたが、文字列以外のデータを含むイテラブルをjoinメソッドで連結したい場合は、map関数を併用することで可能です。
次のように書きます。
''' map関数を使えば、データが数値のイテラブルにjoinメソッドを使うことができます。 '''
list = ['a', 1, 'b', 2]
map_list = map(str, list)
print(' and '.join(map_list))
エラーにならずにリストの中の全ての要素を連結できましたね。
map関数は、map(使用したい関数, 関数を使用したいオブジェクト)と書きます。ここでは数値を文字列化するstr関数を、オブジェクトlistに対して使いたいので、map(str, list)と書きます。
この方法で、先ほどエラーになった辞書のキーや集合の中のデータも、joinメソッドで連結することができます。以下のコードをご覧ください。
''' 辞書のキーをmap関数で文字列化してからjoinメソッドで連結 '''
dict = {1:'mat', 2:'sheet', 'age':30, 'gender':'male'}
map_dict = map(str, dict)
print(', '.join(map_dict))
なお、map関数の戻り値を別の変数に入れる必要はありません。次のように、直接joinメソッドに渡しても大丈夫です。通常はこちらの書き方を使うことが多いでしょう。
''' 集合の中のデータをmap関数で文字列化してからjoinメソッドで連結 '''
set = {1, 2, 3}
print(' ->-> '.join(map(str, set)))
Pythonのjoinメソッドの使い方については、ここまでを抑えておけばバッチリです。
ここからはたまに間違えたり混乱する方を見るのでおまけの解説です。
3. Pythonのos.path.joinメソッド
今いるディレクトリにファイルを追加したり、パスやファイル名を結合させたいという場合には、joinメソッドではなく、os.path.joinメソッドを使います。
次のコードはもっとも基本的な使い方を示したものです。
import os # osモジュールのインポート
path_list = ['/user/', 'moriyamahiroaki/', 'webapp/', 'file.py']
path = os.path.join(*path_list) # 引数の前に * をつける
print(path)
os.path.joinメソッドの場合、引数に*をつける必要があります。
4. Pythonのarray(配列)は joinではなくconcatenateを使う
また科学技術計算に非常に便利なライブラリであるnumpyを使って作るarrya(配列)を連結したい場合は、joinではなくnumpyライブラリのcocatenate関数を使います。
次のコードはもっとも簡単な使い方を示したものです。
''' 配列(array)の連結はjoinではなくconcatenate関数を使います。 '''
# arrayを作ります。
import numpy as np
array_a = np.array([[1, 2], [3, 4]])
array_b = np.array([[5, 6]])
# concatenate関数で連結します。
print(np.concatenate((array_a, array_b)))
5. まとめ
まとめると、Pythonのjoinメソッドはイテラブルの文字列データを連結して、一つの文字列にしてくれるメソッドです。ぜひ、使いこなせるようになっておきましょう。
なお、joinメソッドと反対に、文字列の要素をリスト化するsplitメソッドというものがあります。『Pythonのsplitメソッドで文字列を分割する方法』で解説していますので、joinメソッドと合わせて使いこなせるようになっておきましょう。
コメント