web-dev-qa-db-ja.com

Pythonでカンマで区切って空白を削除する

私はコンマで分割するいくつかのPythonコードを持っていますが、空白を取り除きません:

>>> string = "blah, lots  ,  of ,  spaces, here "
>>> mylist = string.split(',')
>>> print mylist
['blah', ' lots  ', '  of ', '  spaces', ' here ']

私はむしろこのように空白を削除してしまうでしょう:

['blah', 'lots', 'of', 'spaces', 'here']

私はlistをループして各項目をstrip()できることを知っていますが、これはPythonなので、もっと早く、もっと簡単で、よりエレガントな方法があると思います。

280
Mr_Chimp

リスト内包表記を使う - forループと同じくらい簡単で読みやすい。

my_string = "blah, lots  ,  of ,  spaces, here "
result = [x.strip() for x in my_string.split(',')]
# result is ["blah", "lots", "of", "spaces", "here"]

参照: リストの読解に関するPythonのドキュメント
リスト内包表記の2秒間の説明。

482
Sean Vieira

正規表現を使って分割します。注先行スペースを使用して、より一般的なケースにしました。リストを理解するには、前後のNULL文字列を削除します。

>>> import re
>>> string = "  blah, lots  ,  of ,  spaces, here "
>>> pattern = re.compile("^\s+|\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['blah', 'lots', 'of', 'spaces', 'here']

^\s+が一致しなくてもこれは機能します。

>>> string = "foo,   bar  "
>>> print([x for x in pattern.split(string) if x])
['foo', 'bar']
>>>

これがなぜあなたが必要なのかです。

>>> pattern = re.compile("\s*,\s*|\s+$")
>>> print([x for x in pattern.split(string) if x])
['  blah', 'lots', 'of', 'spaces', 'here']

何とか先頭のスペースを見てください。

説明:上記はPython 3インタプリタを使用していますが、結果はPython 2でも同じです。

21
tbc0

私は追加するようになりました:

map(str.strip, string.split(','))

しかし、それがJason Orendorffによって コメント で既に言及されているのを見ました。

同じ答えでGlenn Maynardのコメントを読んで、地図上のリスト内包表記を示唆しているのですが、なぜだろうと思い始めました。私は彼がパフォーマンス上の理由で意図していたと思いました、しかしもちろん彼はスタイル上の理由、または他の何か(Glenn?)のために意味したかもしれません.

ループ内で3つの方法を適用した私の箱の素早い(おそらく欠陥のある?)テストは明らかにしました:

[Word.strip() for Word in string.split(',')]
$ time ./list_comprehension.py 
real    0m22.876s

map(lambda s: s.strip(), string.split(','))
$ time ./map_with_lambda.py 
real    0m25.736s

map(str.strip, string.split(','))
$ time ./map_with_str.strip.py 
real    0m19.428s

map(str.strip, string.split(','))を勝者にすること、それらはすべて同じ球場にいるようです。

確かにmapは(ラムダの有無にかかわらず)必ずしもパフォーマンス上の理由で除外されるべきではありません、そして私にとってそれは少なくともリスト内包表記と同じくらい明確です。

編集する

Ubuntu 10.04上のPython 2.6.5

14
Sean

私はこれがすでに答えられていることを知っています、しかしあなたがこれをたくさんすることを終えるならば、正規表現は行くためのより良い方法かもしれません:

>>> import re
>>> re.sub(r'\s', '', string).split(',')
['blah', 'lots', 'of', 'spaces', 'here']

\sは任意の空白文字と一致します。そして、それを空の文字列''に置き換えるだけです。あなたはここでより多くの情報を見つけることができます: http://docs.python.org/library/re.html#re.sub

11
Brad Montgomery

分割する前に、文字列から空白を削除するだけです。

mylist = my_string.replace(' ','').split(',')
10
user489041
import re
result=[x for x in re.split(',| ',your_string) if x!='']

これは私にとってはうまくいきます。

2
Zieng

re(正規表現のように)は一度に複数の文字に分割することを可能にします。

$ string = "blah, lots  ,  of ,  spaces, here "
$ re.split(', ',string)
['blah', 'lots  ', ' of ', ' spaces', 'here ']

これはあなたの例の文字列にはうまくいきませんが、カンマスペースで区切られたリストにはうまく働きます。文字列の例として、re.splitの力を組み合わせて regexパターン に分割することで、「これで、またはこれで分割」という効果が得られます。

$ re.split('[, ]',string)
['blah',
 '',
 'lots',
 '',
 '',
 '',
 '',
 'of',
 '',
 '',
 '',
 'spaces',
 '',
 'here',
 '']

残念ながら、それは醜いです、しかしfilterはトリックをするでしょう:

$ filter(None, re.split('[, ]',string))
['blah', 'lots', 'of', 'spaces', 'here']

ほら!

2
Dannid
s = 'bla, buu, jii'

sp = []
sp = s.split(',')
for st in sp:
    print st
2
import re
mylist = [x for x in re.compile('\s*[,|\s+]\s*').split(string)

簡単に言うと、カンマまたは少なくとも1つの空白と、前後に空白を入れて/入れないでください。

してみてください!

1
GyuHyeon Choi

map(lambda s: s.strip(), mylist)は明示的にループするより少し良いでしょう。あるいは全部をまとめてmap(lambda s:s.strip(), string.split(','))

1
user470379

map(lambda s: s.strip(), mylist)は明示的にループするより少し良いでしょう。
それとも、全部をまとめて言えば:

map(lambda s:s.strip(), string.split(','))

それが基本的にあなたが必要とするすべてです。

0
DJbigpenis