Сортировка строки в лексикографическом порядке python
Я хочу отсортировать строку в списке в лексикографическом порядке как
str='aAaBbcCdE'
to
['A','a','a','B','b','C','c','d','E']
но sorted()
дает мне этот результат:
['A','B','C','E','a','a','b','c','d']
Как я могу сортировать лексикографически?
Ответы
Ответ 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))