Возврат младшего индекса для первого символа без пробелов в строке в 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 TypeError: 'str' не поддерживает интерфейс буфера
  • Как управлять длиной результата string.format (bool_value) в Python?
  • Самый быстрый способ удалить первую и последнюю строки из строки Python
  • Как найти самую длинную строку в Python?
  • Python: найдите ближайшую строку (из списка) в другую строку
  • Python - удалить любой элемент из списка строк, который является подстрокой другого элемента
  • Извлечение даты из строки в Python
  • Изменение строк в функциях Python
  • Разделить строку только первым пробелом в python
  • Создание словаря из строки
  • Печать без новой строки (печать 'a',) печатает пробел, как его удалить?
  • Python - лучший язык программирования в мире.