Как отсортировать строку utf-8 в Google App Engine на Python?

Как отсортировать строку utf-8 в Google App Engine на Python? Я пытаюсь использовать локальный, но думаю, что это не сработает, а количество поддерживаемых языков слишком мало.

Я пытаюсь использовать pyuca, но это слишком жирно - перезагружать 1 МБ каждый раз, чтобы использовать только 1%% для сортировки.

Есть ли какие-то легкие чистые библиотеки Python или они каким-то образом поддерживаются в Google App Engine.

Если вы считаете, что у вас хороший алгоритм, он пройдет этот тест (вы можете перетасовать строку для тестов):

alphabet = u'AĄBCĆDEĘFGHIJKLŁMNŃOÓPRSŚTUWYZŹŻaąbcćdeęfghijklłmnńoóprsśtuwyzźż'

Любое предложение приветствуется, я проверю его. Этот аплабет 'pl_pl'/'polish'.


person Chameleon    schedule 14.08.2015    source источник


Ответы (1)


Вот подход на чистом Python:

alphabet = u'AĄBCĆDEĘFGHIJKLŁMNŃOÓPRSŚTUWYZŹŻaąbcćdeęfghijklłmnńoóprsśtuwyzźż'
dsort = dict((let, i) for i, let in enumerate(alphabet))

def key_utf8(utf8_string):
  s = utf8_string.decode('utf8')
  return map(dsort.get, s)

some_list_of_utf8_strings.sort(key=key_utf8)

Вам, вероятно, лучше всего порекомендовать хранить список строк unicode внутри — декодирование ввода utf8 сразу и кодирование обратно в utf8 на выходе, если это необходимо — но до тех пор, пока вы готовы потенциально платить вычислительные затраты/задержка декодирования повторяются, этот подход на чистом Python должен работать нормально, в App Engine или где-либо еще.

Если вы действительно следуете наилучшей практике хранения только строк unicode внутри (декодирование на входе, кодирование при необходимости на выходе), то сортировка также может использовать key=lambda s: map(dsort.get, s), но я лично предпочел бы использовать именованная функция (для ясности) вместо несколько глупой лямбды. Просто вопрос стиля, на самом деле.

person Alex Martelli    schedule 14.08.2015