В Python 2 работает следующее:
sorted_list = sorted(unsorted_list, key=lambda s: s.lower())
Он работает как для обычных, так и для unicode-строк, поскольку оба они имеют метод lower
.
В Python 2 это работает для сочетания нормальных и юникодовых строк, поскольку значения двух типов можно сравнивать друг с другом. Python 3 работает не так: вы не можете сравнивать строку байтов и строку юникода, поэтому в Python 3 вы должны делать разумную вещь и только сортировать списки одного типа строк.
>>> lst = ['Aden', u'abe1']
>>> sorted(lst)
['Aden', u'abe1']
>>> sorted(lst, key=lambda s: s.lower())
[u'abe1', 'Aden']
Начиная с python 3.3 существует также метод str.casefold
, специально предназначенный для сопоставления без использования и может использоваться вместо str.lower
:
sorted_list = sorted(unsorted_list, key=lambda s: s.casefold())