Python, splitでカンマ区切り文字列を分割、空白を削除しリスト化
Pythonでカンマ(コンマ)区切りの文字列を分割しリスト化する場合、間に空白(スペース)がないとsplit()
だけで上手くいく。空白がある場合は、strip()
と組み合わせると余分な空白を除去できるので便利。さらにリスト内包表記を使うとスマートに書ける。
ここでは、
- 指定の区切り文字で文字列を分割しリストとして返す
split()
- 文字列の先頭・末尾の余分な文字を削除する
strip()
- リストの要素に関数・メソッドを適用するリスト内包表記
について説明し、'one, two, three'
のような、空白とカンマで区切られた文字列を空白を削除してリスト化する方法を示す。
さらに、
- 数値のリストとして取得する方法
join()
を使ってリストを結合して再び文字列にする方法
についても述べる。
区切り文字以外での文字列の分割は以下の記事を参照。
split(): 指定の区切り文字で文字列を分割しリストとして返す
文字列のメソッドsplit()
を使うと、文字列を指定の区切り文字(引数sep
で指定)で分割し、リスト(配列)として取得できる。
引数sep
を省略して区切り文字を指定しない場合、空白文字で分割しリストを返す。連続するスペースやタブ\t
でも分割されるので、タブ区切り文字列をリスト化したい場合は引数を省略したsplit()
でOK。
s = 'one two three'
l = s.split()
print(l)
# ['one', 'two', 'three']
s = 'one two three'
l = s.split()
print(l)
# ['one', 'two', 'three']
s = 'one\ttwo\tthree'
l = s.split()
print(l)
# ['one', 'two', 'three']
引数sep
で区切り文字を指定すると、その文字列で分割しリストを返す。
s = 'one::two::three'
l = s.split('::')
print(l)
# ['one', 'two', 'three']
カンマ区切りの文字列の場合、余分な空白が無ければ問題ないが、カンマ+空白で区切られた文字列に対してカンマを区切り文字にしてsplit()
を実行すると、先頭に空白が残った文字列のリストになってしまう。
s = 'one,two,three'
l = s.split(',')
print(l)
# ['one', 'two', 'three']
s = 'one, two, three'
l = s.split(',')
print(l)
# ['one', ' two', ' three']
', '
というようにカンマ+スペースを区切り文字にしてもよいが、元の文字列のスペースの個数が異なると対応できない。
s = 'one, two, three'
l = s.split(', ')
print(l)
# ['one', 'two', 'three']
s = 'one, two, three'
l = s.split(', ')
print(l)
# ['one', 'two', ' three']
次に説明する文字列のメソッドstrip()
を使うとスペースが2文字分になったりしても対応できる。
strip(): 文字列の先頭・末尾の余分な文字を削除する
strip()
は文字列の先頭・末尾の余分な文字を削除するメソッド。
引数を省略すると空白文字が除去された新たな文字列を返す。元の文字列自体は変更されない。
s = ' one '
print(s.strip())
# one
print(s)
# one
引数に文字列を指定するとその文字列に含まれる文字が除去される。
s = '-+-one-+-'
print(s.strip('-+'))
# one
この場合、空白は除去されないので、空白も除去したい場合は、例えば'-+ '
のようにスペースも含めた文字列を引数に渡す。
s = '-+- one -+-'
print(s.strip('-+'))
# one
s = '-+- one -+-'
print(s.strip('-+ '))
# one
strip()
は両端を処理するが、先頭のみを処理するlstrip()
、末尾のみを処理するrstrip()
もある。詳細は以下の記事を参照。
リスト内包表記: リストの要素に関数・メソッドを適用
リストの要素に関数やメソッドを適用したい場合、最終的にリストを取得したいのであればforループでまわすのではなくリスト内包表記を使うとスマート。
- 関連記事: Pythonリスト内包表記の使い方
ここでは、split()
で文字列を分割して取得したリストにstrip()
を適用する。空白を含むカンマ区切り文字列の余分な空白を除去してリスト化できる。
s = 'one, two, three'
l = [x.strip() for x in s.split(',')]
print(l)
# ['one', 'two', 'three']
なお、この場合、空文字列''
に対して空文字列''
ひとつを要素とするリストが取得できる。
s = ''
l = [x.strip() for x in s.split(',')]
print(l)
print(len(l))
# ['']
# 1
空文字列に対して空のリストを取得したい場合は、リスト内包表記の中で条件分岐if
を設定する。
s = ''
l = [x.strip() for x in s.split(',') if not s == '']
print(l)
print(len(l))
# []
# 0
また、'one, , three'
のように、カンマ区切りの要素が欠落している場合、最初の方法だと空文字列''
の要素としてリスト化される。
s = 'one, , three'
l = [x.strip() for x in s.split(',')]
print(l)
print(len(l))
# ['one', '', 'three']
# 3
欠落している部分を無視したい場合は、リスト内包表記の中で条件分岐if
を設定すればOK。
s = 'one, ,three'
l = [x.strip() for x in s.split(',') if not x.strip() == '']
print(l)
print(len(l))
# ['one', 'three']
# 2
数値のリストとして取得
数字のカンマ区切り文字列を文字列ではなく数値のリストとして取得したい場合は、リスト内包表記の中で文字列を数値に変換するint()
やfloat()
を適用する。
s = '1, 2, 3, 4'
l = [x.strip() for x in s.split(',')]
print(l)
print(type(l[0]))
# ['1', '2', '3', '4']
# <class 'str'>
s = '1, 2, 3, 4'
l = [int(x.strip()) for x in s.split(',')]
print(l)
print(type(l[0]))
# [1, 2, 3, 4]
# <class 'int'>
join(): リストを結合して文字列として取得
逆のパターンで、リストを結合して特定の区切り文字で区切られた文字列を取得したい場合はjoin()
メソッドを使う。
間違えやすいが、join()
はリストのメソッドではなく文字列のメソッドなので注意。リストは引数として指定する。
s = 'one, two, three'
l = [x.strip() for x in s.split(',')]
print(l)
# ['one', 'two', 'three']
print(','.join(l))
# one,two,three
print('::'.join(l))
# one::two::three
一行にまとめて書いてもいい。
s = 'one, two, three'
s_new = '-'.join([x.strip() for x in s.split(',')])
print(s_new)
# one-two-three
なお、固定の区切り文字を変更するだけだったら、replace()
メソッドで置換するほうが簡単。
s = 'one,two,three'
s_new = s.replace(',', '+')
print(s_new)
# one+two+three
join()
など文字列の連結については以下の記事を参照。