Сортировка результатов не-лексикографически?
Я пытаюсь показать некоторые результаты с помощью человека. Для целей этого вопроса некоторые из них - числа, некоторые - буквы, некоторые из них являются комбинацией двух.
Я пытаюсь понять, как я могу заставить их сортировать вот так:
input = ['1', '10', '2', '0', '3', 'Hello', '100', 'Allowance']
sorted_input = sorted(input)
print(sorted_input)
Желаемые результаты:
['0', '1', '2', '3', '10', '100', 'Allowance', 'Hello']
Фактические результаты:
['0', '1', '10', '100', '2', '3', 'Allowance', 'Hello']
У меня возникли проблемы с тем, как это сделать.
Ответы
Ответ 1
1 - установить модуль natsort
pip install natsort
2 - Импорт natsorted
>>> input = ['1', '10', '2', '0', '3', 'Hello', '100', 'Allowance']
>>> from natsort import natsorted
>>> natsorted(input)
['0', '1', '2', '3', '10', '100', 'Allowance', 'Hello']
Источник: https://pypi.python.org/pypi/natsort
Ответ 2
Я нашел код в следующей ссылке о естественном порядке сортировки, который очень полезен в прошлом:
http://www.codinghorror.com/blog/2007/12/sorting-for-humans-natural-sort-order.html
Ответ 3
Это сделает это. Для целей сравнения он преобразует строки, которые могут быть преобразованы в целое число в это целое число, и оставляет только другие строки:
def key(s):
try:
return int(s)
except ValueError:
return s
sorted_input = sorted(input, key=key)
Ответ 4
В вашем конкретном случае:
def mySort(l):
numbers = []
words = []
for e in l:
try:
numbers.append(int(e))
except:
words.append(e)
return [str(i) for i in sorted(numbers)] + sorted(words)
print mySort(input)
Ответ 5
Вы можете разбить список, отсортировать его, а затем вернуть обратно. Попробуйте что-то вроде этого:
numbers = sorted(int(i) for i in input_ if i.isdigit())
nonnums = sorted(i for i in input_ if not i.isdigit())
sorted_input = [str(i) for i in numbers] + nonnums
Вам нужно будет сделать что-то более сложное, чем isdigit
, если у вас могут быть нецелые числа.
Если это не распространяется на ваши "некоторые из них являются комбинацией этих двух", пожалуйста, уточните, что это значит и какой результат вы ожидаете от них.
(Не проверен, но должен передать идею.)