Применение функции sorted для списка

Есть список:

test = ['1', '0.1', '3', '80', 'abc', '0.4']

Как я могу отсортировать его, чтобы на выходе получился следующий результат:

test = ['0.1', '0.4', '1', '3', '80', 'abc']

Я делал следующим образом

test=sorted(test, key=lambda x: float(x) if x.isdigit() else x)

Но выпадает ошибка, так что не знаю как отсортировать вместе со словами('abc')


Ответы (4 шт):

Автор решения: CrazyElf

Можно сделать вот так:

test = ['1', '0.1', '3', '80', 'abc', '0.41', '21', '0.2', 'xyz']

def get_key(x):
    try:
        return (float(x), '')
    except:
        return (float("inf"), x)

test=sorted(test, key=get_key)
print(test)

Вывод:

['0.1', '0.2', '0.41', '1', '3', '21', '80', 'abc', 'xyz']

Просто как строки весь список нельзя сортировать, тогда, например, будет такой порядок: '1', '21', '3', нужна именно сортировка чисел как чисел, а не как строк. В вашем то примере можно и как строки сортировать, но если будут другие входные данные, которые привёл я - так не заработает.

→ Ссылка
Автор решения: MaxU

Можно воспользоваться модулем natsort:

from natsort import natsorted   #  pip install natsort

test = ['123', '2000', 'Z', '0.1', '0.4', '1', '3', '80', 'abc']

natsorted(test)
>>> ['0.1', '0.4', '1', '3', '80', '123', '2000', 'Z', 'abc']
→ Ссылка
Автор решения: TigerTV.ru

Еще вариант:

test.sort(key=lambda x: float(x) if x.replace('.', '', 1).isdigit() else float('inf'))

Правда есть ограничения: только для положительных чисел.

→ Ссылка
Автор решения: Andrew Holovko

Для сортировки списка содержащего float, int, str вы можете использовать встроенный метод sorted, c параметром key=repr.

Пример:

>>> test = ['1', '0.1', '3', '80', 'abc', '0.4']
>>> print(sorted(test, key=repr))
['0.1', '0.4', '1', '3', '80', 'abc']
→ Ссылка