Для полноты и, возможно, эффективности в крайних случаях, вот решение, использующее numpy argsort:
import numpy as np
lst = ['1 ', ' 9' , ' 4', '2 ']
order = np.argsort(np.array([s.lstrip() for s in lst]))
result = list(np.array(lst)[order])
В целом, я думаю, что использование sorted (..., key = ...) обычно лучшеи это решение имеет больше смысла, если входные данные уже являются пустым массивом.С другой стороны, он использует strip () только один раз для каждого элемента и использует numpy, поэтому вполне возможно, что для достаточно больших списков это может быть быстрее.Кроме того, он формирует порядок, в котором указывается, где каждый отсортированный элемент находился в исходном списке.
В качестве последнего комментария из предоставленного вами кода, но не из приведенного вами примера, я не уверен, что вы просто хотитеубрать начальные пробелы, или сделать больше, например, best-way-to-strip-punctuation-from-a-string-in-python или первый порядок в строке без пунктуации, а затем, если ониравны, порядок в остальном (решение tdelaney) В любом случае может быть неплохо скомпилировать шаблон, например,
import numpy as np
import re
pattern = re.compile(r'[^\w]')
lst = ['1 ', ' 9' , ' 4', '2 ']
order = np.argsort(np.array([pattern.sub('',s) for s in lst]))
result = list(np.array(lst)[order])
или:
import re
pattern = re.compile(r'[^\w]')
r = sorted(['1 ', ' 9' , ' 4', '2 '], key= lambda s: pattern.sub('',s))