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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 原文地址Python比较字符串大小时,根据的是ord函数得到的编码值。基于它的排序函数sort可以很容易为数字和英...
    vola_lei阅读 1,246评论 1 0
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,955评论 25 709
  • 1、引言 数据库设计过程中表、字段等的命名规范也算是设计规范的一部分,不过设计规范更多的是为了确保数据库设计的合理...
    SnowflakeCloud阅读 41,121评论 0 48
  • 一、UIView常见属性 1.frame 位置和尺寸(以父控件的左上角为原点(0,0)) 2.center 中点(...
    脱下国际篮化身程序猿阅读 307评论 0 0
  • (第001笔) 现在,我无法控制自己对你的难以忘怀,但不再对你满怀期待。大多数时候,我们看似在怀念一个人,实际上只...
    清十四L阅读 852评论 1 2