我可以为我的数字语言排序算法做什么?
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)
感谢
答案 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
替换为您的语言环境使用的任何字符集。