私はコンマで分割するいくつかの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なので、もっと早く、もっと簡単で、よりエレガントな方法があると思います。
リスト内包表記を使う - for
ループと同じくらい簡単で読みやすい。
my_string = "blah, lots , of , spaces, here "
result = [x.strip() for x in my_string.split(',')]
# result is ["blah", "lots", "of", "spaces", "here"]
正規表現を使って分割します。注先行スペースを使用して、より一般的なケースにしました。リストを理解するには、前後の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でも同じです。
私は追加するようになりました:
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
私はこれがすでに答えられていることを知っています、しかしあなたがこれをたくさんすることを終えるならば、正規表現は行くためのより良い方法かもしれません:
>>> import re
>>> re.sub(r'\s', '', string).split(',')
['blah', 'lots', 'of', 'spaces', 'here']
\s
は任意の空白文字と一致します。そして、それを空の文字列''
に置き換えるだけです。あなたはここでより多くの情報を見つけることができます: http://docs.python.org/library/re.html#re.sub
分割する前に、文字列から空白を削除するだけです。
mylist = my_string.replace(' ','').split(',')
import re
result=[x for x in re.split(',| ',your_string) if x!='']
これは私にとってはうまくいきます。
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']
ほら!
s = 'bla, buu, jii'
sp = []
sp = s.split(',')
for st in sp:
print st
import re
mylist = [x for x in re.compile('\s*[,|\s+]\s*').split(string)
簡単に言うと、カンマまたは少なくとも1つの空白と、前後に空白を入れて/入れないでください。
してみてください!
map(lambda s: s.strip(), mylist)
は明示的にループするより少し良いでしょう。あるいは全部をまとめてmap(lambda s:s.strip(), string.split(','))
map(lambda s: s.strip(), mylist)
は明示的にループするより少し良いでしょう。
それとも、全部をまとめて言えば:
map(lambda s:s.strip(), string.split(','))
それが基本的にあなたが必要とするすべてです。