Какой самый короткий способ сделать это в Python?
string = " xyz"
должен возвращать index = 3
Какой самый короткий способ сделать это в Python?
string = " xyz"
должен возвращать index = 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 (the_answer), а не O (len (input_string))
Многие из предыдущих решений повторяются в нескольких пунктах в предлагаемых им решениях. И некоторые делают копии данных (строки). re.match(), strip(), enumerate(), isspace() дублируют работу сцены.
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':
Или вы можете протестировать все данные как итерационные один раз, а не проверять, является ли каждая строка итерируемой. Помните такие вещи, как "[0] вызывает исключение, тогда как" " [0:] не делает.
Если вы хотите направить решение на inline, вы можете перейти к непитоновскому маршруту:
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