この短いチュートリアルでは、Pythonで文字列を連結する方法について、いくつかの異なるアプローチを通して見ていきます。
Pythonの文字列は不変であり、一度作成された文字列オブジェクトは変更することができません。
newString = "Some new string"
もしこの文字列を何らかの方法で変更したい場合、その変更を反映した新しい文字列が作成されます。
文字列を連結する場合も同様で、新しいオブジェクトをメモリ上に作成しなければなりません。
文字列の連結と文字列の追加
文字列の連結
文字列の連結とは、2つ以上の文字列を鎖のようにつなげることです。
例えば、 str1
を str2
と str3
の間に連結するように、任意の順序で連結することができます。
文字列の追加とは、1つまたは複数の文字列を別の文字列の末尾に追加することを指します。
場合によっては、これらの用語は絶対に交換可能です。
文字列の追加とは、文字列を別の文字列の末尾に連結することと同じ操作です。
まず、2つ(またはそれ以上)の文字列を連結/追加する最も簡単な方法から説明します。
文字列の結合と追加を行う + 演算子
Python では、文字列は文字のリストです。
つまり、+
演算子を使うと、文字列の構成要素を新しいリストに追加することができます。
title = "Prof. "
name = "Richard Feynman"
result = title + name
print(result)
この結果は
Prof. Richard Feynman
この演算子は足し合わせる文字列の量を制限しないので、たくさんの文字列を簡単に結合することができます。
string1 = "Concatenating"
string2 = "strings"
string3 = "in Python"
string4 = "is easy!"
print(string1 + string2 + string3 + string4)
しかし、このような文字列のリストから文章を構成することを目的とする場合、特殊文字を使わずに手作業で文字列を連結すると、効率が悪く、意味不明な出力になってしまいます。
Concatenatingstringsin Pythonis easy!
文字列のリストを繰り返し処理し、連結された文字列の間に空白を入れて足し合わせる方がずっと賢明です。
strings = ["Concatenating", "strings", "in Python", "is easy!"]
result = ""
for string in strings:
result += string + " "
print(result)
この結果は
Concatenating strings in Python is easy!
2つの文字列を連結するために使える省略記法の演算子は +=
で、前の例と同じように使えます。
これは、結果を格納するために新しい変数を作成する手間を省くことができます。
なぜなら、既存の参照変数のいずれかを再利用して、メモリ内の新しいオブジェクトに代入することができるからです。
string1 = "one"
string2 = "two"
string1 += string2
print(string1) # Output: onetwo
演算子の制限
演算子 +
の主な制限は、型を混在させることができないことです。
たとえば、整数を文字のリストに追加することはできません。
print("some string" + 2)
JavaScript や Java などの多くの言語では、整数を自動的に文字列に変換して (型が一致するように) 連結しますが、Python では TypeError
がスローされます。
TypeError: can only concatenate str (not "int") to str
しかし、簡単な回避策があります。
Pythonの組み込み関数である str()
を使って、互換性のあるデータ型を文字列に変換することができるのです。
ここでは、 strings
リストにいくつかの整数を追加して、文字列でない要素がある場合に備えてすべての項目を str()
で囲んでみましょう。
strings = ["Concatenating", "strings", "in Python", "is easy!", 5, 2]
result = ""
for string in strings:
result += str(string) + " "
print(result)
この結果は
Concatenating strings in Python is easy! 5 2
* 演算子で文字列を連結または追加する
ある文字列をn回複製して新しい文字列を作りたい場合、
*` 演算子を使えば実現できます。
string = "w"
print(string * 3) # Output: www
これは +
演算子と組み合わせるとさらに便利です。
print("w"*3 + "." + "stackabuse.com")
という結果になります。
www.stackabuse.com
% 演算子による文字列の連結と追加
繰り返しになりますが、文字列の連結は必ずしも末尾に文字列を追加することを意味するわけではありません。
演算子 %
を使うと、文字列の補間を行うことができます。
文字列の中にマーカーとして %
を入れておけば、後でそのマーカーを具体的な文字列に置き換えることができます。
string = "This %s is a %s string" % ("here", "random")
print(string)
このように出力されるはずです。
This here is a random string
同様に、他のデータ型にも他のマーカーを使用することができます。
-
%d
– 整数表現用です。
string = "This is a string%d" % (1)
print(string) # Output: This is a string
-
%c
– 文字の表現に使用します。
string = "This string starts with a %c" % ('T')
print(string) # Output: This string starts with a T
-
%f
– 浮動小数点数。
string = "There is a %f percent chance that you'll learn string concatenation in Python after reading this article" % (99.99)
print(string) # Output filled 99,990000 in %f place
注意: もし、数値を何桁に丸めるか (例えば 2) を明示的に指定したい場合は、次のようにする。
Pythonでの文字列の書式設定とそのさまざまな方法についてもっと読みたい場合は、 Python 3 の f-Strings で文字列を書式設定するガイドを読んでください。
join() メソッドによる文字列の連結
join()メソッドはイテラブルを引数に取り、そのイテラブルの要素を結合した文字列を返します。
注目すべきは、これらは文字列でなければならないということです。
先ほどのメソッドとは異なり、各要素は本質的にstr()` を使って変換されるわけではありません。
さらに、 separator
を使用して、結合された文字列の間の区切り文字を定義します。
my_list = ["1", "2", "3", "4"] # List - iterable
string_from_list = "-".join(my_list) # The separator is "-"
print(string_from_list)
これは次のように出力されるはずです。
1-2-3-4
多くの場合、セパレータは単なる空白文字なので、一般的には次のように表示されます。
" ".join(iterable)
カスタムjoin()メソッドの実装
組み込みの join()
メソッドの挙動は予想と少し異なるかもしれませんので、独自の join()
メソッドを、調整可能な separator
を使って実装してみましょう。
2 次元のリストも扱えるようにしたいので、リストがそれ自身の中に別のリストを含んでいる場合は、1 次元のリストにフラット化してから結合します。
import itertools
def join(iterable, separator):
# Empty string to hold result
result = ""
# Flatten 2D potentially 2D list into 1D
iterable = list(itertools.chain(*iterable))
# Concatenate strings with separator
for string in iterable:
result += str(string) + separator
return result
string = join(['a', 'b', 'c'], ' ')
string2 = join(['a', ['b', 'c'], 'd'], ' ')
print(string)
print(string2)
この結果は
a b c
a b c d
スペースによる文字列の連結
文字列を連結する簡単な方法は、通常は印刷するときだけスペースバーを活用することです。
この方法は一般的に印刷時のみに使われます。
メモリ上のオブジェクトに代入するのは簡単ですが、厄介だからです。
print("Concat" " strings" " using Space")
文字列の中で空白を使わないようにしたい場合は、各要素の間にカンマ (,
) を入れることができます。
print("Concat", "strings", "using Space")
これらの結果は、どちらも
Concat strings using Space
これらを変数に代入すれば、自動的に1つの文字列に連結されます。
string = "this " "is " "a " "big " "string"
print(type(string))
print(string)
その結果、次のようになる。
<class 'str'=""
this is a big string
複数行の文字列を作成することもできます。
これを実現するために、各行の末尾に “ を追加して、Pythonに複数行であることを知らせます。
multi_line_string = "this " "string "
"is coded in " "three lines "
"but printed in one"
print(multi_line_string)
この結果は
this string is coded in three lines but printed in one
しかし、この方法は面倒で厄介なので、他の方法が望ましいです。
注意: 同じ効果は変数では得られず、文字列リテラルのみで得られます。
string1 = "one string"
string2 = "two string"
final_string = string1 string2
この結果は
File "<string", line 4
final_string = string1 string2
^
SyntaxError: invalid syntax
結論
Pythonで文字列を結合/追加/連結することは非常にシンプルで、Pythonに関連するすべてのもののように、それを行う方法はたくさんあります。
それはあなたのニーズと好みによります。
この短いチュートリアルでは、文字列を連結する方法のいくつかを見てきました。
になります。