Я хочу отсортировать строку в списке в лексикографическом порядке как
str='aAaBbcCdE'
до
['A','a','a','B','b','C','c','d','E']
но sorted() дает мне такой вывод:
sorted()
['A','B','C','E','a','a','b','c','d']
Как я могу отсортировать лексикографически?
Не используйте лямбда-функции, когда есть встроенные функции для работы.Также никогда не используйте аргумент cmp sorted, потому что он устарел:
cmp
sorted(s, key=str.lower)
или
sorted(s, key=str.upper)
Но это может не поддерживать порядок «A» и «a», поэтому:
sorted(sorted(s), key=str.upper)
, что, и по природе sorted операция будет очень быстрой для почти отсортированных списков (второй sorted).
sorted
Вы можете использовать 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).
str.lower(x)
a
B
x
A
cmp был старый способ сделать это, теперь не рекомендуется, но для потомков:
s='aAaBbcCdE' sorted(s, lambda x,y: cmp(x.lower(), y.lower()) or cmp(x,y))
data = input() data=list(data) data.sort()
Теперь для переменной «data» будет предоставлен лексикографически отсортированный ввод.