如何使用我的数字语言对算法进行排序?

时间:2011-02-27 18:01:19

标签: python algorithm

我可以为我的数字语言排序算法做什么?

khmer_number = [0,1,2,3,4,5,6,7,8,9]#unicode utf-8 for khmer language number

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(高棉语)从unicode聊天中的17E0 - 17E9开始

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

感谢

4 个答案:

答案 0 :(得分:3)

看起来您将数字值保存在字符串中。在这种情况下,我建议您考虑将这些字符串转换为数字,排序,然后转换回字符串表示。

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

你定义了两个函数“int_to_khmer”和“khmer_to_int”。我希望我可以提供更多帮助,但我不知道在utf-8中的高棉语言规范。

答案 1 :(得分:3)

如果你把你的字符表示为unicode,只需使用sorted()就会以正确的方式对它们进行排序(只要你希望它们在unicode值之后排序):

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

如果你想要一个更具体的实现,只需提供你自己的key函数,它接受一个值并返回一个用于排序的键:

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)) 

答案 2 :(得分:1)

我不知道Python,所以我不能给你一个代码示例。

如果unicode值的排序与所需的排序匹配,您只需使用此值进行排序。

如果不是这种情况,您可以使用地图将您的数字映射到匹配的所需顺序,并在排序算法中使用此地图。

要使排序算法通用,您可以选择传递自定义比较器,它可以将两个值相互比较。

更新:

也许this HowTo可以给你一些想法。 (或者只是您正在寻找的解决方案。; p)

答案 3 :(得分:1)

我认为您有充分的理由实施自己的排序算法,而不是使用.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为您提供了一堆转义值,那么您可能需要执行print s.encode('utf-8')之类的操作,将utf-8替换为您的语言环境使用的任何字符集。