note.nkmk.me

Python, splitでカンマ区切り文字列を分割、空白を削除しリスト化

Date: 2017-11-22 / Modified: 2018-02-03 / tags: Python, 文字列操作, リスト
このエントリーをはてなブックマークに追加

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

リスト内包表記: リストの要素に関数・メソッドを適用

リストの要素に関数やメソッドを適用したい場合、最終的にリストを取得したいのであればforループでまわすのではなくリスト内包表記を使うとスマート。

ここでは、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
スポンサーリンク
シェア
このエントリーをはてなブックマークに追加

関連カテゴリー

関連記事