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

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

string = " xyz" 

должен возвращать индекс = 3

7 Solutions collect form web for “Возврат младшего индекса для первого символа без пробелов в строке в Python”

 >>> 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 
  • Интерполяция строк python
  • Сбой при оптимизации последовательности строк в CPython
  • Я не могу найти правильную спецификацию форматирования для предыдущих нулей в python
  • Как получить имя файла без расширения из пути в Python?
  • Как избежать разрыва строки, уже присутствующего в строке?
  • Почему str () округляет всплывающие окна?
  • Извлечение даты из строки в Python
  • Преобразование строки в тип даты на Python
  • Python - лучший язык программирования в мире.