Pythonでこれを行う最短の方法は何ですか?
string = " xyz"
インデックス=3を返す必要があります
>>> s = " xyz"
>>> len(s) - len(s.lstrip())
3
>>> next(i for i, j in enumerate(' xyz') if j.strip())
3
また
>>> next(i for i, j in enumerate(' xyz') if j not in string.whitespace)
3
Python <2.5のバージョンでは、次のことを行う必要があります。
(...).next()
「正規表現は何でもできる」旅団が休みを取ったように見えるので、次のように記入します。
>>> tests = [u'foo', u' foo', u'\xA0foo']
>>> import re
>>> for test in tests:
... print len(re.match(r"\s*", test, re.UNICODE).group(0))
...
0
1
1
>>>
FWIW:所要時間はO(len(input_string))ではなくO(the_answer)です
以前のソリューションの多くは、提案されたソリューションのいくつかのポイントで繰り返されています。また、データ(文字列)のコピーを作成するものもあります。re.match()、strip()、enumerate()、isspace()は、舞台裏で複製されています。The
next(idx for idx, chr in enumerate(string) if not chr.isspace())
next(idx for idx, chr in enumerate(string) if not chr.whitespace)
垂直タブなどのさまざまな主要な空白タイプに対して文字列をテストするための良い選択ですが、それもコストを追加します。
ただし、文字列でスペース文字またはタブ文字のみを使用している場合は、次のより基本的なソリューションである明確で高速なソリューションでも、使用するメモリが少なくなります。
def get_indent(astr):
"""Return index of first non-space character of a sequence else False."""
try:
iter(astr)
except:
raise
# OR for not raising exceptions at all
# if hasattr(astr,'__getitem__): return False
idx = 0
while idx < len(astr) and astr[idx] == ' ':
idx += 1
if astr[0] <> ' ':
return False
return idx
これは視覚的に絶対的に最速または単純ではないかもしれませんが、このソリューションのいくつかの利点は、これを他の言語やバージョンのPythonに簡単に転送できることです。また、魔法の動作がほとんどないため、デバッグが最も簡単です。関数の要点を関数ではなくコードとインラインで配置すると、関数呼び出し部分が削除され、このソリューションのバイトコードが他のソリューションと同様になります。
さらに、このソリューションでは、より多くのバリエーションが可能です。タブのテストを追加するなど
or astr[idx] == '\t':
または、各行が反復可能かどうかを確認する代わりに、データ全体を1回反復可能としてテストできます。"" [0]は例外を発生させますが、 "" [0:]は発生しないことを覚えておいてください。
ソリューションをインラインにプッシュしたい場合は、Python以外のルートを使用できます。
i = 0
while i < len(s) and s[i] == ' ': i += 1
print i
3
。。
import re
def prefix_length(s):
m = re.match('(\s+)', s)
if m:
return len(m.group(0))
return 0
>>> string = " xyz"
>>> next(idx for idx, chr in enumerate(string) if not chr.isspace())
3
>>> string = " xyz"
>>> map(str.isspace,string).index(False)
3