Возврат младшего индекса для первого символа без пробелов в строке в Python

Какой самый короткий способ сделать это в Python?

string = "   xyz"

должен возвращать index = 3

Ответ 1

>>> s = "   xyz"
>>> len(s) - len(s.lstrip())
3

Ответ 2

>>> 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()

Ответ 3

Похоже, что "регулярные команды могут что-то сделать" бригада взяла выходной, поэтому я запишу:

>>> 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))

Ответ 4

Многие из предыдущих решений повторяются в нескольких пунктах в предлагаемых им решениях. И некоторые делают копии данных (строки). 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

. .

Ответ 5

import re
def prefix_length(s):
   m = re.match('(\s+)', s)
   if m:
      return len(m.group(0))
   return 0

Ответ 6

>>> string = "   xyz"
>>> next(idx for idx, chr in enumerate(string) if not chr.isspace())
3

Ответ 7

>>> string = "   xyz"
>>> map(str.isspace,string).index(False)
3