64

これで文字列の先頭のスペースを数えることができます:

>>> a = "   foo bar baz qua   \n"
>>> print "Leading spaces", len(a) - len(a.lstrip())
Leading spaces 3
>>>

しかし、もっとpythonicな方法はありますか?

4

7 に答える 7

96

あなたのやり方は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
于 2012-11-30T16:21:13.227 に答える
24

あなたが使用することができます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

このコードが実際に元のソリューションよりも優れているかどうかはわかりません。一時的な文字列を作成しないという利点がありますが、それはかなりマイナーです (文字列が本当に大きい場合を除きます)。どちらのバージョンもそのコード行についてすぐに明確になるとは思わないので、複数回使用する予定がある場合は、適切な名前の関数でラップすることをお勧めします (いずれの場合も適切なコメントを付けて)。

于 2012-11-30T16:16:29.567 に答える
13

多様性のために、理論的には正規表現を使用できます。これは少し短く、 への二重呼び出しよりも見栄えがし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)).

于 2012-11-30T16:26:25.563 に答える
4

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))
于 2012-11-30T16:26:22.100 に答える
2

それは...私には素晴らしいです。通常、私は「X は Pythonic ですか?」と答えます。いくつかの機能的な魔法で質問しますが、そのアプローチが文字列操作に適しているとは思いません.

先頭のスペースのみを返すビルトインlen()があり、それを取得する場合は、それを選択しますが、AFAIKはありませんre。他のソリューションは絶対にやり過ぎです。

于 2012-11-30T16:13:29.013 に答える