ゼロから始めるプログラミング
スモールステップで Python を基礎から学べる、初学者の方向けの講座です。演習問題を通して Python の使い方を理解し、データ分析や機械学習実装のための基礎を身につけることを目指します。
DX を推進する AI ・データサイエンス人材育成コース
プログラミング未経験から、AI やデータサイエンスを学ぶことのできる 6 ヶ月間のコースです。転職実績も豊富で、自走できる AI人材を多く輩出しています。
split() メソッドとは
split() メソッドは、与えられた文字列に自分で区切り方と区切る回数を自由に指定して分割することができます。
また、分割された文字列は配列として取得されます。
初心者の方は配列として取得されるところで躓きやすいので、ゆっくり勉強してみてくださいね。
split() メソッドの基本的な使い方
次のような空白で区切られた文字列があったとします。
text = "apple banana cherry"
ここにデフォルトのsplit() メソッドを呼び出します。
words = text.split()
するとwords にはリスト型で空白ごとに区切られた単語が格納されます。
print(words) # ['apple', 'banana', 'cherry']
第一引数:区切り文字を指定:sep
split()メソッドは何も指定しなければ、先ほどのように空白ごとに区切ってリスト型にしてくれます。
では、次のような文字列の場合はどうなるのでしょうか。
text = "apple,banana,cherry"
このように単語を区切っている文字のことを区切り文字と呼びます。
区切り文字が空白でない場合は第一引数で指定することができます。
words = text.split(',')
この時、区切り文字は必ず文字列になるので”(シングルクォーテーション)のつけ忘れに注意しましょう。
第二引数:分割回数を指定:num
最初と同様に次のような文字列が用意されていたとします。
text = "apple banana cherry"
この文字列を回数を指定して区切りたい時には第二引数を指定します。
ここで、区切り文字はデフォルトのままで良いので第一引数にはNone を指定しました。
words = text.split(None,1)
split() メソッドの戻り値はリスト型
split() メソッドの戻り値は常にリスト型になります。
区切り文字が文字列に存在しない場合でも、リスト型が返されるので注意しましょう。
text = "apple orange banana mango"
result = text.split(',')
print(result)
#出力: ['apple orange banana mango']
print(type(result))
#出力: <class 'list'>
split() メソッドの応用テクニック
CSV ファイルをリスト型に変換
自然言語処理を勉強されている方が成果物としてレコメンドアプリを作成されることがあります。
実はこちら、csv ファイルを使うと簡単に作成することができます。
その際、split() メソッドを使ってリスト型に変換することが必須になるのでご紹介しておきます。
#必要なライブラリのインポート
import csv
# CSVファイルのパス
file_path = 'example.csv'
# 結果を保存するリスト
result = []
# ファイルを開く
with open(file_path, 'r') as file:
# 各行を読み込む
for line in file:
# 改行文字を削除してから分割
cleaned_line = line.strip()
elements = cleaned_line.split(',')
result.append(elements)
# 結果を表示
print(result)
strip() メソッドは引数を指定しなければ、不要な改行や余分な空白を削除してくれます。
split() メソッドの戻り値はリスト型でした。
このコードでは事前にcsv ファイルをリスト型に変換した結果を入れるresult を用意しました。
strip() メソッドで不要な改行や余分な空白が削除されたcleaned_line には ‘,’ で区切られた文字列が入っているので、
elements = cleaned_line.split(',')
を使って区切り、リスト型に変換しています。
append() メソッドはリストの末尾に要素を追加します。リストを扱う上で必須なので、ぜひ丁寧に学習してみてください。
文字列を複数の変数に分割する
文字列を分割して複数の変数に直接割り当てるには、split() 関数とアンパッキング(unpacking)を組み合わせます。
文字列を特定の区切り文字で分割し、それぞれの要素を別々の変数に割り当てることができます。
まずは基本的なアンパックの使い方を見ていきましょう!
# 基本的なアンパックの使い方
text = "apple orange banana mango"
fruit1, fruit2, fruit3, fruit4 = text.split()
print(fruit1) # 出力: apple
print(fruit2) # 出力: orange
print(fruit3) # 出力: banana
print(fruit4) # 出力: mango
split() メソッドによってtext に含まれる文字列が空白ごとに4つに分割され、複数の変数に割り当てられていますね!
区切り文字を指定する場合には、第一引数を指定してください。
分割数が変わる場合
分割数が変わる場合や部分的な分割しか必要ない場合は、アスタリスク(*)を使ったアンパッキングを利用します。
アスタリスクを使うことで、残りの要素をリストとして格納できます。
# 部分的な分割と残りの要素
text = "apple,orange,banana,mango,grape,kiwi"
fruit1, fruit2, *remaining_fruits = text.split(',')
print(fruit1) # 出力: apple
print(fruit2) # 出力: orange
print(remaining_fruits) # 出力: ['banana', 'mango', 'grape', 'kiwi']
apple とorange 以外はリスト型になっていますね!
最大分割数を指定してアンパック
split() メソッドの第二引数であるmaxsplit を指定すると最大の分割数を制限できましたね!
# 最大分割数を指定
text = "apple,orange,banana,mango"
fruit1, fruit2, remaining_fruits = text.split(',', 2)
print(fruit1) # 出力: apple
print(fruit2) # 出力: orange
print(remaining_fruits) # 出力: banana,mango
ここではremaining_fruits の中身はリスト型ではありませんので注意してください。
split() と関連するメソッド
rsplit():右から分割
rsplit() メソッドは、文字列を指定された区切り文字(デフォルトは空白文字)で分割してくれます。
右側から分割していく点を除いて split() メソッドと同様に機能します。
お気づきかもしれませんが、右側から分割するという特性がrsplit() の名前の由来です(right split)。
由来を知っておくと、覚えやすいですね!
では、実際のコードを確認していきましょう。
text = "apple banana orange"
# rsplit() メソッドで右側から空白文字で分割
result = text.rsplit()
print(result)
# 出力: ['apple', 'banana', 'orange']
このようにしてrsplit() メソッドでもデフォルトではsplit 関数と同様に空白文字ごとに分割して、文字列をリスト型にしてくれます。
上のコードを見て「split() メソッドと同じ出力結果になったじゃないか」と思われた方がいらっしゃるかもしれません。split() メソッドとrsplit() メソッドは区切る回数を指定して分割しない場合には同じ出力結果になります。
rsplit() メソッドは第二引数で指定した数だけ右から区切るという特徴があります。
text = "apple,banana,cherry,dates"
#カンマで左側から最大2回分割
result_1=text.split(',', maxsplit=2)
#カンマで右側から最大2回分割
result_2=text.rsplit(',', maxsplit=2)
print(result_1)
# 出力: ['apple','banana','cherry,dates']
print(result_2)
# 出力: ['apple,banana', 'cherry', 'dates']
このコードではsplit() メソッドとrsplit() メソッドの違いがわかりやすいようにそれぞれのメソッドを使って分割してみました。
分割する方向が異なる以外は同じように動作することがお分かりいただけるでしょうか。
rsplit() メソッドは分割する方向のみsplit() メソッドと反対の右側からになります。
splitlines():改行で分割
続いて、実際に制作物を作成する際に役に立つ、改行で分割する方法をご紹介します。
「改行されるごとに分割するならsplit() メソッドを使って「\n」を区切り文字に指定すれば良いのではないか」と思われた方もいらっしゃると思います。
ですが、区切り文字を指定する手間がかかってしまうので、ここでは新しいメソッドをご紹介しますね!
改行文字とは、行の最後に挿入されているものです。
Macを含むUnix 系OS では\n 、WIndows 系OS では\r\n が使われます。
普段は目に見えないですが、空白と同様に1文字分を占有しています!
基本的な使い方は次の通りです。
text = "Hello\nWorld\nWelcome"
# splitlines() メソッドで改行文字で分割
lines = text.splitlines()
print(lines)
# 出力: ['Hello', 'World', 'Welcome']
デフォルトでは改行文字で分割されますが、引数を指定することで別の動作をすることができます。
‘keepends=True’ を指定すると、各行の末尾に改行文字が含まれたままとなります。
text = "Hello\nWorld\nWelcome"
# keepends=True を指定して分割
lines = text.splitlines(keepends=True)
print(lines)
# 出力: ['Hello\n', 'World\n', 'Welcome']
split() メソッドの代替手段と操作
split() メソッドの使い方には慣れてきたでしょうか?
ここでは、split() メソッドをより使いこなすために裏技をたくさんご紹介します!
str.replace():区切り文字を他の値に変換
str.replace() メソッドは、文字列内の特定の部分文字列を指定した別の文字列で置換することができます。
第一引数に文字列内の変えたい部分、第二引数に変えたい文字列をダブルクォーテーションで囲って指定します。
text = "Hello, World!"
# 文字列内の "Hello" を "Hi" で置換
new_text = text.replace("Hello", "Hi")
print(new_text)
# 出力: Hi, World!
これを役立てる例としては次のような場合が考えられます。
text = "apple&banana&cherry"
#& を空白に置換して変換
replaced_text = text.replace("&", " ")
print(tab_separated_string)
#出力:apple banana cherry
#デフォルトのsplit() メソッドで分割
result=replaced_text.split()
print(result)
#出力:['apple', 'banana', 'cherry']
このように事前に区切り文字を他の値に変換してからsplit() メソッドを使うことができます!
str.strip():区切り文字を削除
str.strip() メソッドは、文字列から先頭および末尾の不要な文字を取り除くことができます。
デフォルトでは空白文字(スペース、タブ、改行など)が削除されます。
引数に特定の文字列を指定すると、その文字も削除対象とすることができます。
# 例1:空白文字の削除
text = " Hello, World! "
result = text.strip()
print(result)
# 出力:Hello, World!
# 例2:特定の区切り文字の削除
text = "###Python Programming###"
result = text.strip("#")
print(result)
# 出力:Python Programming
split() メソッドとstrip() メソッドを併用する場面をご紹介していきます。
次のような文字列をName 、Age 、Occupation のそれぞれに分割したいとき皆さんならどうしますか?
text = ",,,Name, Age, Occupation,,,"
text に含まれる文字列には、先頭と末尾にカンマ(,)が複数あり、項目名の間にも余分な空白が見られます。
そこでstrip() メソッドを使ってこれらを削除してから、split() メソッドでカンマ(,)を区切り文字として分割することを考えます。
text = ",,,Name, Age, Occupation,,,"
columns = text.strip(", ").split(", ")
print(columns)
# 出力: ['Name', 'Age', 'Occupation']
CSV ファイルにスクレイピングを行った際などは特に余分な文字が含まれていることが多いため、制作物に取り掛かるまでにstrip() メソッドをマスターしておきましょう。
str.find() : 区切り文字を検索
find() メソッドは、指定した文字列や区切り文字が初めて出現する位置を返します。
もし見つからなければ -1 を返します。
まず、find() メソッドの基本的な使い方を確認しましょう!
text = "Name, Age, Occupation"
index = text.find(", ")
print(index)
# 出力: 4
この場合、Name の後にカンマ(,)があるため、位置は4になります。
位置は0 始まりで数えます。
では、split() メソッドと合わせてfind() メソッドを使う場合を見ていきましょう!
# カンマで区切られたデータの整形
text = ",,,Name, Age, Occupation,,,"
index = text.find("Name")
if index != -1:
cleaned_text = text[index:].strip(", ")
columns = cleaned_text.split(",")
else:
columns = []
print(columns)
# 出力: ['Name', 'Age', 'Occupation']
text.find(“Name”)では、Name が最初に出現する位置を見つけます。
位置が見つかれば、その位置以降の文字列を切り取ります。
!= とは≠ の意味なので、if index!=-1 に含まれる部分が位置が見つかった場合の処理になります。
そして、切り取られた文字列の中身は、
"Name, Age, Occupation,,,"
になっているので、末尾のカンマ(,)をstrip()メソッドを使って削除しています。
最後にsplit()メソッドでリストに分割していますね!
text[index:] とは4 以上の位置の文字列を指します。
str.partition():区切り文字を中心に3分割する
このメソッドは、指定した区切り文字の最初の出現位置を中心にして、文字列を「区切り文字の前の部分」「区切り文字自体」「区切り文字の後の部分」の3つに分割します。
区切り文字が見つからない場合は、元の文字列が最初の要素になります。
残りの他の2つの要素は空の文字列となります。
まずは基本的な使い方を確認していきましょう!
text = "apple,banana,cherry"
part = text.partition(',')
print(part) # 出力: ('apple', ',', 'banana,cherry')
この例では、,(カンマ)が区切り文字になっていますね。
最初のカンマを中心にして、文字列が3部分に分割されています。
partition() メソッドは文字列を一度の区切り文字の出現で分割するのに対し、split() は区切り文字が出現するたびに文字列を分割します。
partition() メソッドを使う場面としては、データの最初の区切りまでの部分を扱いたい時です。
text = "Name: John; Age: 30; Occupation: Engineer"
name_part = text.partition(';')
print(name_part)
# 出力: ('Name: John', ';', ' Age: 30; Occupation: Engineer')
partition() メソッドを使うと最初のデータをより簡単に見つけ出せますね!
np.split():配列を分割
np.split() メソッドは、NumPy ライブラリで提供されている配列分割関数の1つです。
配列を等間隔または指定されたインデックスで分割するために使用されます。
np.split() メソッドの他にも np.array_split() メソッド、np.hsplit() メソッド、np.vsplit() メソッドなどがあります。
今回は、初心者の方に向けた記事ですのでnp.split() メソッドに焦点を当てて説明します。
まず、基本的な使い方をご紹介します。
ここからは配列の基本的な知識が必要ですので、まだよくわからない方は復習してから見てみてくださいね!
np.split(array, indices_or_sections, axis=0)
- array : 分割する対象の NumPy 配列
- indices_or_sections : インデックスのリストまたは分割するセクション数
- axis : 分割する軸(デフォルトは 0)
まず、第二引数をインデックスリストで指定してみましょう。
import numpy as np
# 例1:インデックスの指定で分割
array = np.arange(9)
print(f"元の配列: {array}")
splits = np.split(array, [3, 6])
for i, split in enumerate(splits):
print(f"分割後の配列 {i + 1}: {split}")
#出力結果
#元の配列: [0 1 2 3 4 5 6 7 8]
#分割後の配列 1: [0 1 2]
#分割後の配列 2: [3 4 5]
#分割後の配列 3: [6 7 8]
配列の 0から始まるインデックスで区切り位置を指定します。
[3, 6] の場合、最初の位置が3、次の位置が6ということになります。
インデックスリストの値は、元の配列の長さ以内である必要があります。
範囲外の値を指定すると ValueError が発生します。
ちなみに、print() メソッドにはコードを簡潔にするためにフォーマット文字列を用いました。
少し難しい内容ですが、興味のある方は調べてみてくださいね!
次に第二引数を分割するセクション数で指定してみます。
# 例2:セクション数を指定して等分割
array = np.arange(9)
splits = np.split(array, 3)
for i, split in enumerate(splits):
print(f"分割後の配列 {i + 1}: {split}")
#出力結果
#分割後の配列 1: [0 1 2]
#分割後の配列 2: [3 4 5]
#分割後の配列 3: [6 7 8]
indices_or_sections に整数を指定することで等分割が可能です。
なお、等分割する場合には元の配列のサイズは整数で割り切れる必要があります。
ちなみに、np.array_split() メソッドでは配列の長さが指定した分割数で割り切れない場合でも使えます。
# 例3:`np.array_split` の使用
array = np.arange(10)
splits = np.array_split(array, 3)
for i, split in enumerate(splits):
print(f"分割後の配列 {i + 1}: {split}")
#出力結果
#分割後の配列 1: [0 1 2 3]
#分割後の配列 2: [4 5 6]
#分割後の配列 3: [7 8 9]
次に、第三引数まで指定してみましょう!
axis パラメータを使用すると異なる軸に沿った分割ができるようになります。
# 例4:2次元配列の分割
array = np.arange(16).reshape(4, 4)
print(f"元の配列:\n{array}\n")
splits = np.split(array, 2, axis=1) # 列方向に2分割
for i, split in enumerate(splits):
print(f"分割後の配列 {i + 1}:\n{split}\n")
#出力結果
#元の配列:
[[ 0 1 2 3]
[ 4 5 6 7]
[ 8 9 10 11]
[12 13 14 15]]
#分割後の配列 1:
[[ 0 1]
[ 4 5]
[ 8 9]
[12 13]]
#分割後の配列 2:
[[ 2 3]
[ 6 7]
[10 11]
[14 15]]
split() メソッドの注意点
split() メソッドを使って文字列の分割をする際には、区切り文字は一つしか指定できないということに注意しましょう。
では、複数の区切り文字を指定する必要がある複雑な分割をするにはどうしたら良いのでしょうか?
split() メソッドと正規表現の組み合わせ
split() メソッドと正規表現の組み合わせにより、通常の区切り文字だけでは難しい複雑な分割を行うことができます。
この組み合わせにはre.split() を利用します。
早速、基本的な使い方を確認しましょう!
re.split(pattern, string, maxsplit=0, flags=0)
- pattern : 正規表現パターン
- string : 分割対象の文字列
- maxsplit : 最大分割数(デフォルトは 0 で制限なし)
- flags : 正規表現のオプション
正規表現を使う際にはライブラリのインポートが必要になるので下のコードを必ず記述してくださいね!
import re
正規表現ではさまざまなことができるようになるのですが、ここでは複数の区切り文字を使う例として2つだけご紹介します!
空白文字を含む分割
空白文字(スペース、タブ、改行など)をすべて分割に含めるには \s+ を使います。
import re
text = "apple orange\tbanana\nmango"
result = re.split(r'\s+', text)
print(result)
# 出力: ['apple', 'orange', 'banana', 'mango']
複数の区切り文字で分割
複数の異なる区切り文字(カンマ、セミコロン、パイプ)で分割します。
import re
text = "one,two;three|four.five-six"
result = re.split(r'[;,|.-]', text)
print(result) # 出力: ['one', 'two', 'three', 'four', 'five', 'six']
正規表現の解析は計算コストが高いため、必要な場合にのみ使用することをお勧めします!
split関数のパフォーマンスの注意点
split()メソッドを使った文字列操作は便利ですが、大量のデータ(例えば、長いテキストや非常に多くの要素)に対して split()メソッドを使うと、多くのリスト要素が生成され、メモリ消費が増えます。
特に、分割後のリストに含まれる要素が非常に多い場合にはパフォーマンスが低下してしまいます。
まとめ
split() メソッドはテキストデータを特定の区切り文字で分割するために使うことができます。
制作物を作るにあたっても非常に役に立つのでぜひ活用してみてくださいね!
ゼロから始めるプログラミング
スモールステップで Python を基礎から学べる、初学者の方向けの講座です。演習問題を通して Python の使い方を理解し、データ分析や機械学習実装のための基礎を身につけることを目指します。
DX を推進する AI ・データサイエンス人材育成コース
プログラミング未経験から、AI やデータサイエンスを学ぶことのできる 6 ヶ月間のコースです。転職実績も豊富で、自走できる AI人材を多く輩出しています。