Используйте ключ сортировки:
ms = "abcdABCD"
sorted_ms = sorted(ms, key=lambda letter:(letter.upper(), letter.islower()))
# sorted_ms = ['A', 'a', 'B', 'b', 'C', 'c', 'D', 'd']
sorted_str = ''.join(sorted_ms)
# sorted_str = 'AaBbCcDd'
Почему это работает:
Вы можете указать критерии, по которым производится сортировка, используя аргумент key
в функции sorted
или метод list.sort()
- здесь ожидаются функция или лямбда, которая принимает рассматриваемый элемент и выводит новый критерии, по которым можно отсортировать. Если этот «новый критерий» является кортежем, то первый элемент имеет приоритет - если он равен, то второй аргумент и т. Д.
Итак, лямбда, которую я здесь предоставил, возвращает 2-кортеж:
(letter.upper(), letter.islower())
letter.upper()
в качестве первого элемента здесь означает, что строки будут отсортированы лексографически, но без учета регистра (так как они будут сортировать их , как если бы они были все в верхнем регистре). Затем я использую letter.islower()
в качестве второго аргумента, который равен True
, если буква строчная, и False
в противном случае. При сортировке False
предшествует True
- это означает, что если вы введете заглавную букву и строчную букву, заглавная буква будет стоять первой.