リファクタリングをPythonで実践!基本手法とコード例・注意点まで
この記事では、文字列の結合に便利なjoin関数の基本的な使い方から応用的な使い方まで紹介します。様々なオブジェクトの結合例を紹介していますのでぜひご覧ください。
1.Pythonのjoin関数とは?
Pythonのjoinは、「join」とあるように引数の要素を結合する関数です。
例えば引数にリストを与えるとひとつの文字列として出力できます。そのほかにも、結合する際の区切る文字を指定することなどが可能になります。
2.join関数の基本的な使い方
ここからはjoin関数の基本的な使い方を紹介します。
①文字列リストを連結させる
はじめに最も基本的な使い方を紹介します。join関数にリストを与えるだけの例です。早速ソースコードを見ていきましょう。
list1 = ["Taro", "Jiro", "Saburo"]
result = "".join(list1)
print(result)
# TaroJiroSaburo
ご覧のようにlist1の要素を結合できました。
この例では空の文字列(””)に要素を結合することで、リスト内の要素を結合しています。
元々が空の文字列でない場合は以下のようになります。
list1 = ["Taro", "Jiro", "Saburo"]
result = ",".join(list1)
print(result)
# Taro,Jiro,Saburo
ご覧のように各要素の間にカンマが入りました。このようにjoin関数の前の文字列が各要素の間に挿入されます。
②数値を含むリストを連結させる
次は数値が含まれるリストを紹介します。数値が入っている場合、join関数を使用するとエラーが発生します。
list1 = ["Taro", "Jiro", 3]
result = "".join(list1)
print(result)
Traceback (most recent call last):
File "C:\Users\test.py", line 3, in <module>
result = "".join(list1)
TypeError: sequence item 2: expected str instance, int found
最終行にあるように、str型が予想される引数にint型を与えたためエラーになります。よってjoinを利用する前にリスト内の要素をすべてstr型に変換する必要があります。実際の例を見ていきましょう。
list1 = ["Taro", "Jiro", 3]
map1 = map(str, list1)
print(map1)
# <map object at 0x0000013AF1C99820>
list2 = list(map1)
print(list2)
# ['Taro', 'Jiro', '3']
result = "".join(list2)
print(result)
# TaroJiro3
map関数とstr関数、list関数の組み合わせで変換を行っています。map関数の第一引数に行いたい処理、第二引数に処理を行うリストを与えます。今回はstr関数を与えました。結果、各要素にstr関数の処理が実行され文字列になりました。
map関数を利用するとリスト型のオブジェクトではなくなります。そのためlist関数に与えてリスト型オブジェクトに変換し、join関数で結合しています。
③pathを連結させる
Pythonでpathを操作する場合、os.pathを利用します。pathの指定文字列はOSによって異なります。基本的な使い方は今までと変わらないので例を見てみましょう。
import os
path_obj = ["user", "local", "Python", "join"]
path = os.path.join(*path_obj)
print(path)
# user/local/Python/join
ご覧のようにpathの形になりました。上記例ではMacで実行しました。Windowsで実行した場合はスラッシュがバックスラッシュになります。
このようにOSに応じたpathを作成する場合は、os.pathとjoinを組み合わせましょう。
3.join関数の応用的な使い方
ここからは応用的な使い方を紹介します。より実践的な内容になるので頑張って習得しましょう!
①文字列リスト連結時に改行を入れる
文字列連結時に改行させたい場合は、改行コードを各要素間に挿入する必要があります。実際の例を見てみましょう。
list1 = ["1段目", "2段目", "3段目"]
result = "\n".join(list1)
print(result)
# 1段目
# 2段目
# 3段目
ご覧のように改行して出力できました。基本的な使い方でも紹介したように、各要素間に挿入する文字を指定できます。指定する文字に改行コードを指定することで実現可能です。
②2次元リストの要素を連結させる
2次元リストを結合する場合は一筋縄ではいきません。ソースコードを見ながら確認していきましょう。
result = ""
list1 = [
["lemon", "apple", "orange"],
["Taro", "Jiro", "Saburo"]
]
for i in range(2):
keep = ",".join(list1[i])
result = result + keep
print(result)
# lemon,apple,orangeTaro,Jiro,Saburo
ご覧のようにfor文を用いて結合しました。次元数がわかる場合は比較的簡単に結合できます。
③n次元の要素を連結する
先ほどの例では2次元とわかっていたのでfor文で対応できました。では次元数がわからない場合はどうするのでしょうか。実際の例を見てみましょう。
list1 = [
[
[1],[2],[3]
],
[
[1],[2],[3]
],
[
[1],[2],[3]
]
]
def change_dimensions(list1):
search = list1[0]
result = []
if not isinstance(search, (int, str)):
for i in list1:
result += i
else:
return list1
return change_dimensions(result)
print(change_dimensions(list1))
# [1, 2, 3, 1, 2, 3, 1, 2, 3]
ご覧のように多次元リストを1次元のリストに変換しています。リストの1番目の要素が数値、または文字列になるまで同じ関数を呼び出し、1番目の要素がリストではなくなったら(=文字列、または数値)リストを返しています。
1次元に変換後は今まで紹介した例のように結合を行いましょう。
4.join関数で連結できるオブジェクト
ここまではリストの結合を紹介してきましたが、join関数で結合できるのはリストだけではありません。ここではjoin関数で結合できるオブジェクトを紹介します。
①mapオブジェクト
先ほどの例ではリストに変換しましたが、mapオブジェクトはjoinで結合できます。
list1 = ["Taro", "Jiro", 3]
map1 = map(str, list1)
# <map object at 0x0000013AF1C99820>
result = "".join(map1)
print(result)
# TaroJiro3
②str
result = ",".join("join関数で結合")
print(result)
# j,o,i,n,関,数,で,結,合
分かりやすいように間にカンマを挿入しました。ご覧のように結合できています。
③辞書オブジェクト
こちらは意外かもしれませんが、辞書オブジェクトも結合可能です。結合するとキーが結合されます。
dic = {"key1":"value1", "key2":"value2", "key3":"value3"}
result = ",".join(dic)
print(result)
# key1,key2,key3
④タプル
タプルも結合が可能です。
tp = ("a", "b", "c")
result = "".join(tp)
print(result)
# abc
5.単純に文字を連結したい場合
ここまでjoin関数を紹介してきましたが、単純な文字列の結合の場合、joinを利用する必要はありません。
①+演算子を使う
Pythonで文字列を結合する場合は、+演算子を利用しましょう。
str1 = "Taro"
str2 = "Jiro"
print(str1 + str2)
# TaroJiro
ご覧の通り結合できました。Excelの&のように利用できます。
②+=演算子を使う
+=演算子でも文字列を結合できます。早速ソースコードを見ていきましょう。
list1 = ["Taro", "Jiro", "Saburo"]
result = ""
for i in list1:
result += i
print(result)
# TaroJiroSaburo
+=演算子は現状保持している値に追加の値を結合します。そのため、for文で結合する場合などは+=演算子を利用しましょう。