Подтвердить что ты не робот

Сортировка строки в лексикографическом порядке python

Я хочу отсортировать строку в списке в лексикографическом порядке как

str='aAaBbcCdE'

to

['A','a','a','B','b','C','c','d','E']

но sorted() дает мне этот результат:

['A','B','C','E','a','a','b','c','d']

Как я могу сортировать лексикографически?

4b9b3361

Ответ 1

Не используйте лямбда-функции, если для работы заданы встроенные функции. Также никогда не используйте аргумент cmp для сортировки, потому что он устарел:

sorted(s, key=str.lower)

или

sorted(s, key=str.upper)

Но это может не содержать "A" и "a" в порядке, поэтому:

sorted(sorted(s), key=str.upper)

который будет и по характеру sorted операция будет очень быстрой для почти отсортированных списков (вторая sorted).

Ответ 2

Для ключа можно использовать 2-кортеж:

text='aAaBbcCdE'
sorted(text,key=lambda x:(str.lower(x),x))
# ['A', 'a', 'a', 'B', 'b', 'C', 'c', 'd', 'E']

Первый элемент в кортеже, str.lower(x) является первичным ключом (создание a выполняется до B), а x сам ломает связи (делает a раньше a).

Ответ 3

cmp был старый способ сделать это, теперь устарел, но для потомков:

s='aAaBbcCdE'
sorted(s, lambda x,y: cmp(x.lower(), y.lower()) or cmp(x,y))