Что я могу сделать для сортировки алгоритма с моим языком чисел? - PullRequest
2 голосов
/ 27 февраля 2011

Что я могу сделать для алгоритма сортировки моего языка чисел?

khmer_number = [០, ១, ២, ៣, ៤, ៥, ៥, ៧, ៨, ៩] # unicode utf-8 для номера языка кхмерского языка

internatonal_number = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

А у меня есть функция сортировки с использованием Naive sort,Quick sort,Bubble sort,

Теперь, например, с:

# -*- coding: utf-8 -*-
naive_sort(ls):
    while ls:
       e = min(ls)
       ls.remove(e)
       yield e

Если у меня есть список

ls = [4, 2, 5, 3, 7, 0]
naive_sort[ls]
output
[0,2,3,4,5,7]

У кого-нибудь есть пример идеи, если у меня есть список, но в my number (khmer language)

ls = [៤, ៤, ៦, ៥, ៧, ០]​  #= here is correspod this list ls = [4, 2, 5, 3, 7, 0]
naive_sort[ls]
output
[០,២,៣,៤,៥,៦] //<=>[0,2,3,4,5,7]

Как я могу реализовать алгоритм, чтобы я мог применять и свой язык чисел,

Мой номер Unicode (кхмерский язык) начинается с 17E0 - 17E9 в чате Unicode

(http://unicode.org/charts/PDF/U1780.pdf)

спасибо

Ответы [ 4 ]

3 голосов
/ 27 февраля 2011

Похоже, вы держите свои числовые значения в строке. В этом случае я бы посоветовал вам подумать о преобразовании этих строк в числа, сортировке и последующем преобразовании обратно в строковое представление.

numberList = map(khmer_to_int, myList)
numberList.sort()
myList = map(int_to_khmer, numberList)

где две функции "int_to_khmer" и "khmer_to_int" определены вами. Я хотел бы помочь больше, но я не знаю специфику кхмерского языка в отношении utf-8.

3 голосов
/ 27 февраля 2011

Если вы представляете свои символы как юникод, просто используя sorted (), они будут отсортированы правильно (то есть, если вы хотите, чтобы они сортировались после значений в юникоде):

list = ['\u17E2', '\u17E4', '\u17E0']
print(list)
print(sorted(list))       # sorted

Если вы хотитеБолее конкретная реализация - просто предоставить свою собственную функцию ключа, которая принимает одно значение и возвращает ключ, который используется для сортировки:

def sortop(val):
    ''' Implement however you want the values sorted.'''
    dict = {'\u17E0' : 0, '\u17E1' : 1, '\u17E2' : 2, '\u17E3' : 3, '\u17E4' : 4}
    return dict[val]

if __name__ == '__main__':
    list = ['\u17E2', '\u17E4', '\u17E0']
    print(list)
    print(sorted(list, key=sortop)) 
1 голос
/ 27 февраля 2011

Я так понимаю, у вас есть веская причина для реализации собственного алгоритма сортировки, а не использования метода .sort() или встроенного sorted()? Если это так, то вы можете сделать следующее:

def naive_sort(ls, key):
    ls = [(key(i), i) for i in ls]
    while ls:
       e = min(ls)
       ls.remove(e)
       yield e[1]

Теперь вы можете использовать naive_sort следующим образом:

khmer_number = [u'\u17e0', u'\u17e1', u'\u17e2', u'\u17e3', u'\u17e4', u'\u17e5', u'\u17e6', u'\u17e7', u'\u17e8', u'\u17e9']
international_number = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
number_map = dict(zip(khmer_number, international_number))

ls = [khmer_number[n] for n in [4, 2, 5, 3, 7, 0]]
print list(naive_sort(ls, key=lambda x: number_map[x]))

Обновление

Я не уверен, что это то, о чем вы спрашиваете, но если у вас есть номер в строке, вы можете составить его список следующим образом:

>>> list(u'\u17E0\u17E2\u17E3\u17E4\u17E5\u17E7')
[u'\u17e0', u'\u17e2', u'\u17e3', u'\u17e4', u'\u17e5', u'\u17e7']

Имея такой список, вы можете преобразовать его обратно в строку с помощью

s = ''.join([u'\u17e0', u'\u17e2', u'\u17e3', u'\u17e4', u'\u17e5', u'\u17e7'])

Если print s дает вам кучу escape-значений, то вам может потребоваться сделать что-то вроде print s.encode('utf-8'), заменив utf-8 на любой набор символов, используемый вашей локалью.

1 голос
/ 27 февраля 2011

Я не знаю о Python, поэтому не могу дать вам пример кода.

В случае, если порядок значений Юникода соответствует желаемому порядку, вы можете просто использовать это значение для сортировки.

Если это не так, вы можете использовать карту, которая отображает ваши числа в соответствии с желаемым порядком, и использовать эту карту в алгоритме сортировки.

Чтобы сделать алгоритм сортировки общим, вы можете передать пользовательский компаратор, который может сравнивать два значения друг с другом.

UPDATE:

Возможно, этот HowTo может дать вам несколько идей. (Или просто решение, которое вы ищете.; P)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...