これで文字列の先頭のスペースを数えることができます:
>>> a = " foo bar baz qua \n"
>>> print "Leading spaces", len(a) - len(a.lstrip())
Leading spaces 3
>>>
しかし、もっとpythonicな方法はありますか?
これで文字列の先頭のスペースを数えることができます:
>>> a = " foo bar baz qua \n"
>>> print "Leading spaces", len(a) - len(a.lstrip())
Leading spaces 3
>>>
しかし、もっとpythonicな方法はありますか?
あなたのやり方はpythonicですが正しくありません。スペースのみを明示的にカウントするために、他の空白文字もカウントしますa.lstrip(' ')
:
a = " \r\t\n\tfoo bar baz qua \n"
print "Leading spaces", len(a) - len(a.lstrip())
>>> Leading spaces 7
print "Leading spaces", len(a) - len(a.lstrip(' '))
>>> Leading spaces 3
あなたが使用することができますitertools.takewhile
sum( 1 for _ in itertools.takewhile(str.isspace,a) )
そして、それがあなたのコードと同じ結果をもたらすことを示します:
>>> import itertools
>>> a = " leading spaces"
>>> print sum( 1 for _ in itertools.takewhile(str.isspace,a) )
4
>>> print "Leading spaces", len(a) - len(a.lstrip())
Leading spaces 4
このコードが実際に元のソリューションよりも優れているかどうかはわかりません。一時的な文字列を作成しないという利点がありますが、それはかなりマイナーです (文字列が本当に大きい場合を除きます)。どちらのバージョンもそのコード行についてすぐに明確になるとは思わないので、複数回使用する予定がある場合は、適切な名前の関数でラップすることをお勧めします (いずれの場合も適切なコメントを付けて)。
多様性のために、理論的には正規表現を使用できます。これは少し短く、 への二重呼び出しよりも見栄えがしlen()
ます。
>>> import re
>>> a = " foo bar baz qua \n"
>>> re.search('\S', a).start() # index of the first non-whitespace char
3
または、次のようにします。
>>> re.search('[^ ]', a).start() # index of the first non-space char
3
しかし、これはお勧めしません。私が行った簡単なテストによると、len(a)-len(lstrip(a))
.
next
と の使用enumerate
:
next((i for i, c in enumerate(a) if c != ' '), len(a))
空白の場合:
next((i for i, c in enumerate(a) if not c.isspace()), len(a))
それは...私には素晴らしいです。通常、私は「X は Pythonic ですか?」と答えます。いくつかの機能的な魔法で質問しますが、そのアプローチが文字列操作に適しているとは思いません.
先頭のスペースのみを返すビルトインlen()
があり、それを取得する場合は、それを選択しますが、AFAIKはありませんre
。他のソリューションは絶対にやり過ぎです。