Python, splitでカンマ区切り文字列を分割、空白を削除しリスト化
Pythonでカンマ区切りの文字列を分割しリスト化する場合、間に空白(スペース)がなければsplit()
だけで上手くいく。空白がある場合は、strip()
と組み合わせると余分な空白を除去できる。リスト内包表記を使うとスマートに書ける。
区切り文字以外での文字列の分割は以下の記事を参照。
カンマ区切りのデータ形式であるCSVファイルを処理したい場合は以下の記事を参照。
指定の区切り文字で文字列を分割しリスト化: split()
文字列str
のsplit()
メソッドは、引数に指定した区切り文字で文字列を分割し、リスト(配列)として返す。
引数を省略すると空白文字(スペースやタブ\t
)で分割するので、スペース区切りやタブ区切り文字列をリスト化したい場合は引数を省略した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\ttwo\tthree'
l = s.split()
print(l)
# ['one', 'two', 'three']
引数に区切り文字を指定すると、その文字列で分割しリストを返す。
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()
を使うとスペースの個数が異なっていても対応できる。
文字列の先頭・末尾の余分な文字を削除: strip()
文字列str
の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)
# ['']
空文字列に対して空のリストを取得するには、リスト内包表記の中で条件分岐if
を設定する。
s = ''
l = [x.strip() for x in s.split(',') if not s == '']
print(l)
# []
また、'one, , three'
のように、カンマ区切りの要素が欠落している場合、最初の方法だと空文字列''
の要素としてリスト化される。
s = 'one, , three'
l = [x.strip() for x in s.split(',')]
print(l)
# ['one', '', 'three']
欠落している部分を無視するには、リスト内包表記の中で条件分岐if
を設定する。
s = 'one, , three'
l = [x.strip() for x in s.split(',') if not x.strip() == '']
print(l)
# ['one', 'three']
数値のリストとして取得
数字のカンマ区切り文字列を文字列ではなく数値のリストとして取得したい場合は、リスト内包表記の中で文字列を数値に変換するint()
やfloat()
を適用する。
なお、int()
やfloat()
は先頭・末尾の空白を無視するので、strip()
は不要。
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) 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
文字列の連結や置換についての詳細は以下の記事を参照。