Python 中文排序

来源:互联网 发布:java一定要去培训班吗 编辑:程序博客网 时间:2024/06/06 13:18

最近项目需要对一些条目进行排序,这些条目都是汉字词组,使用Python传统的.sort,或sorted都失败了,原因很简单,汉字编码和字母编码根本就不是一回事,汉字的编码顺序并非按照拼音和笔画顺序大小排序。因此在排序时需要借助拼音编码对照表和笔画对照表。

基本原理

假设输入为汉字字符串数组,还是按照最简单的排序原理。这里的的大小依据是就是拼音对照表中的编码值和笔画对照表中的编码值。先按拼音比较,如果拼音编码值相等,则比较其笔画编码。对于两个多汉字单词的比较,先比较首单词,若相同在比较第二个单词,以此类推。

直接上代码,附注释

# coding: utf-8 # 建立拼音辞典dic_py = dict()with open('./py.txt','r',encoding = 'utf8') as f:    content_py = f.readlines()    for i in content_py:        i = i.strip()        word_py, mean_py= i.split('\t')        dic_py[word_py]=mean_py# 建立笔画辞典dic_bh = dict()with open('./bh.txt','r',encoding = 'utf8') as f:    content_bh = f.readlines()    for i in content_bh:        i = i.strip()        word_bh, mean_bh = i.split('\t')        dic_bh[word_bh]=mean_bh################################ 辞典查找函数def searchdict(dic,uchar):    # 一    齚    if  u'\u4e00' <= uchar <=u'\u9fa5':           value=dic.get(uchar)        if value == None:            value = '*'    else:        value = uchar    return value#比较单个字符def comp_char_PY(A,B):    if A==B:        return -1    pyA=searchdict(dic_py,A)    pyB=searchdict(dic_py,B)    # 比较拼音    if pyA > pyB:        return 1    elif pyA < pyB:        return 0    # 比较笔画    else:        bhA=eval(searchdict(dic_bh,A))        bhB=eval(searchdict(dic_bh,B))        if bhA > bhB:            return 1        elif bhA < bhB:            return 0        else:            return "拼音相同,笔画也相同?"#比较字符串def comp_char(A,B):    n=min(len(A),len(B))    i=0    while i < n:        dd=comp_char_PY(A[i],B[i])        # 如果第一个单词相等,就继续比较下一个单词        if dd == -1:            i=i+1            # 如果比较到头了            if i==n:                dd=len(A)>len(B)        else:            break    return dd# 排序函数def cnsort(nline):    n = len(nline)    lines="\n".join(nline)    for i in range(1, n):  # 插入法        tmp = nline[i]        j = i        while j > 0 and comp_char(nline[j-1],tmp):            nline[j] = nline[j-1]            j -= 1        nline[j] = tmp    return nlinechar=['衣','食','住','行','诗','酒','茶']char = sorted(char)print ('输入:',char)char=cnsort(char)print ('输出:',char)

结果:

image.png

原创粉丝点击