408

カンマで分割するPythonコードがいくつかありますが、空白を削除しません。

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

私はむしろ次のように空白を削除することになります:

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

リストをループして各アイテムをstrip()できることは承知していますが、これはPythonであるため、より速く、より簡単で、よりエレガントな方法があると思います。

4

11 に答える 11

724

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秒の説明。

于 2010-11-01T17:30:38.607 に答える
32

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

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

しかし、コメントでJasonOrendorffによってすでに言及されているのを見ました。

マップ上のリスト内包表記を示唆する同じ回答に対するGlennMaynardのコメントを読んで、私はなぜだろうと思い始めました。私は彼がパフォーマンス上の理由で意味していると思いましたが、もちろん彼は文体的な理由で、または何か他のものを意味しているかもしれません(グレン?)。

したがって、私のボックス(Ubuntu10.04のPython2.6.5)で3つのメソッドをループに適用する簡単な(おそらく欠陥がありますか?)テストにより、次のことが明らかになりました。

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

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

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

map(str.strip, string.split(','))彼らはすべて同じ球場にいるようですが、勝者になります。

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

于 2013-02-28T14:25:23.683 に答える
26

正規表現を使用して分割します。先頭のスペースを使用して、ケースをより一般的にしたことに注意してください。リスト内包表記は、前後のヌル文字列を削除することです。

>>> 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']
>>>

^ \s+が必要な理由は次のとおりです。

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

何とかで先頭のスペースを見ますか?

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

于 2012-10-06T13:18:58.050 に答える
20

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

mylist = my_string.replace(' ','').split(',')
于 2010-11-01T18:26:37.143 に答える
13

これはすでに回答済みですが、これを何度もやめた場合は、正規表現の方が適している可能性があります。

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

\sすべての空白文字に一致し、空の文字列に置き換えるだけ''です。詳細については、http: //docs.python.org/library/re.html#re.subをご覧ください。

于 2012-02-01T05:30:22.760 に答える
3

map(lambda s: s.strip(), mylist)明示的にループするよりも少し良いでしょう。または一度にすべてのために:map(lambda s:s.strip(), string.split(','))

于 2010-11-01T17:31:29.500 に答える
2

re(正規表現のように)一度に複数の文字を分割できます。

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

これは、サンプル文字列ではうまく機能しませんが、コンマスペースで区切られたリストではうまく機能します。例の文字列では、re.splitパワーを組み合わせて正規表現パターンを分割し、「split-on-this-or-that」効果を得ることができます。

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

残念ながら、それは醜いですが、filterそれでうまくいきます。

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

出来上がり!

于 2015-03-16T07:57:52.000 に答える
2
import re
result=[x for x in re.split(',| ',your_string) if x!='']

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

于 2015-06-02T11:57:50.057 に答える
1
s = 'bla, buu, jii'

sp = []
sp = s.split(',')
for st in sp:
    print st
于 2015-01-31T02:15:33.683 に答える
1
import re
mylist = [x for x in re.compile('\s*[,|\s+]\s*').split(string)]

単純に、コンマまたは少なくとも1つの空白(前後の空白あり/なし)。

してみてください!

于 2017-04-26T06:59:22.677 に答える
0

最初に文字列を分割してから空白を気にする代わりに、最初に文字列を処理してから分割することができます

string.replace(" ", "").split(",")
于 2021-07-28T11:42:41.923 に答える