Какой самый короткий способ сделать это в Python?
string = " xyz"
должен вернуть индекс = 3
Какой самый короткий способ сделать это в Python?
string = " xyz"
должен вернуть индекс = 3
>>> next(i for i, j in enumerate(' xyz') if j.strip())
3
or
>>> next(i for i, j in enumerate(' xyz') if j not in string.whitespace)
3
в версиях Python ‹ 2.5 вам нужно будет сделать:
(...).next()
blah.strip()
и blah.isspace()
нормально работают с Unicode; string.whitespace застыл в прошлом веке.
- person John Machin; 04.03.2010
string.whitespace
вторым наиболее эффективным подходом после общепринятого.
- person SilentGhost; 04.03.2010
Похоже, бригада «регулярные выражения могут все» взяли выходной, так что я заполню:
>>> 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:] - нет.
Если вы хотите внедрить решение в строку, вы можете пойти по маршруту, отличному от Python:
i = 0
while i < len(s) and s[i] == ' ': i += 1
print i
3
. .
strip()
. Исходную строку можно просто использовать повторно с другой начальной позицией.
- person bernie; 03.09.2020
+
вместо *
. Мои мыслительные способности не были полностью включены этим утром.
- person D.Shawley; 04.03.2010