Как правильно отсортировать строку с номером внутри? [дубликат]
Возможные Дубликаты:
есть ли у Python встроенная функция для естественной сортировки строк?
у меня есть список строк, содержащих числа, и я не могу найти хороший способ их сортировки.
Например, я получаю что-то вроде этого:
something1
something12
something17
something2
something25
something29
С sort()
метод.
Я знаю, что мне, наверное, нужно как-то извлечь номера, а затем отсортировать список, но я понятия не имею, как это сделать самый простой способ.
1 ответ:
возможно, вы ищете человека сортировки (также известный как естественная сортировка):
import re def atoi(text): return int(text) if text.isdigit() else text def natural_keys(text): ''' alist.sort(key=natural_keys) sorts in human order http://nedbatchelder.com/blog/200712/human_sorting.html (See Toothy's implementation in the comments) ''' return [ atoi(c) for c in re.split('(\d+)', text) ] alist=[ "something1", "something12", "something17", "something2", "something25", "something29"] alist.sort(key=natural_keys) print(alist)
доходность
['something1', 'something2', 'something12', 'something17', 'something25', 'something29']
PS. Я изменил свой ответ, чтобы использовать реализацию естественной сортировки Toothy (опубликовано в комментариях здесь) так как это значительно быстрее, чем мой первоначальный ответ.
если вы хотите сортировать текст с поплавками, то вам нужно будет изменить регулярное выражение из того, что соответствует ints (т. е.
(\d+)
) к регулярное выражение, которое соответствует поплавки:import re def atof(text): try: retval = float(text) except ValueError: retval = text return retval def natural_keys(text): ''' alist.sort(key=natural_keys) sorts in human order http://nedbatchelder.com/blog/200712/human_sorting.html (See Toothy's implementation in the comments) float regex comes from https://stackoverflow.com/a/12643073/190597 ''' return [ atof(c) for c in re.split(r'[+-]?([0-9]+(?:[.][0-9]*)?|[.][0-9]+)', text) ] alist=[ "something1", "something2", "something1.0", "something1.25", "something1.105"] alist.sort(key=natural_keys) print(alist)
доходность
['something1', 'something1.0', 'something1.105', 'something1.25', 'something2']