Python 中文排序

最近项目需要对一些条目进行排序,这些条目都是汉字词组,使用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 nline

char=['衣','食','住','行','诗','酒','茶']
char = sorted(char)
print ('输入:',char)
char=cnsort(char)
print ('输出:',char)

结果:

image.png

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值