Сортировка результатов не-лексикографически?

Я пытаюсь показать некоторые результаты с помощью человека. Для целей этого вопроса некоторые из них - числа, некоторые - буквы, некоторые из них являются комбинацией двух.

Я пытаюсь понять, как я могу заставить их сортировать вот так:

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

Ответ 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, если у вас могут быть нецелые числа.

Если это не распространяется на ваши "некоторые из них являются комбинацией этих двух", пожалуйста, уточните, что это значит и какой результат вы ожидаете от них.

(Не проверен, но должен передать идею.)