Вот один из способов:
sorted( lst, key=lambda x: (x.lower(), *map(str.isupper, x)) )
#['A', 'aa', 'aA', 'aaa', 'aaA', 'aAa', 'b', 'B', 'c', 'CC']
Первая сортировка букв без учета регистра. Затем вызовите str.upper
для всех символов каждой строки в качестве второго условия сортировки. Это будет ранжировать строчные буквы первыми для строк одинаковой длины.
Python 2 версия
Приведенный выше синтаксис работает только в python3, но вы можете эквивалентно сделать следующее в python2:
sorted( lst, key=lambda x: ((x.lower(),) + tuple(map(str.isupper, x))) )
Взлом, который я использую для нечетного форматирования во время XmlSerialization, должен иметь специальное свойство, которое только используется во время XmlSerialization
//normal DateTime accessor
[XmlIgnore]
public DateTime Delivered { get; set; }
//special XmlSerialization accessor
[XmlAttribute("DateTime")]
public string XmlDateTime
{
get { return this.Delivered.ToString("o"); }
set { this.Delivered = new DateTime.Parse(value); }
}