本文实例讲述了Python实现针对中文排序的方法。分享给大家供大家参考,具体如下:

Python比较字符串大小时,根据的是ord函数得到的编码值。基于它的排序函数sort可以很容易为数字和英文字母排序,因为它们在编码表中就是顺序排列的。

>> print ','< '1'<'A'<'a'<'阿'

True

但要很处理中文就没那么容易了。中文通常有拼音和笔画两种排序方式,在最常用中文标准字符集GB2312中,3755个一级中文汉字是按照拼音序进行编码的,而3008个二级汉字则是按部首笔画排列,

>> print '曙'< '鲑','曾'<'怡'

True True

出现这样的结果是因为‘曙'和‘曾'都是常用字,而‘鲑'和‘怡'都是次常用字,但无论从笔画还是拼音来看,这两对顺序都应该反过来。后来扩充的GBK和GB18030编码为了向下兼容,都没有更改之前的汉字顺序,于是sort之后的次序就很乱了。

另一方面unicode编码的中文是按《康熙字典》的偏旁部首和笔画数来排列的,所以排序结果和GB编码又不一样。

# encoding=utf8

char=['赵','钱','孙','李','佘']

char.sort()

for item in char:

print item.decode('utf-8').encode('gb2312')

输出是:"佘孙李赵钱";而保存成gb2312编码后

# encoding=gb2312

char=['赵','佘']

char.sort()

for item in char:

print item

输出是:“李钱孙赵佘”。显然,这两个结果都不是我们想要的。那我们究竟怎样才能对中文正确排序呢?

先要弄清楚中文词典的排序规则:先按拼音排列,区分四声,拼音相同的就看笔画数目多少,笔画数也相同的再按笔顺中的具体笔划类型来区分,新华字典采用的顺序是一丨丿丶乙,也称作“天上人间”,应该没有笔划类型也完全一样的。所以中文排序不仅需要带音调的汉字拼音对照表,还需要有具体笔顺的数据。

本以为有现成的模块,试了几个都不理想。pyzh的转换代码只支持不到7千字,而且还没有音调。水木的roy的代码涵盖了2万多字符,但需要pysqlite支持......还是自立更生吧~

我找到最全的数据是slowwind9999上传到csdn的unicode汉字编码表(点击此处本站下载。),包括全部20902个汉字的全拼、五笔、郑码、UNICODE、GBK、笔画数 部首,以及笔顺编号(拼音部分没有音调,而且个别注音有误,如 郑g,茸郑褂眯枳⒁狻#┪姨崛×似渲械谋仕呈荩钟媒炯摹笆涤煤鹤肿匆簟背绦蛑谱髁unicode汉字音调版,其中中文汉字用四声标注,319个日韩汉字没有音调以示区别,并根据汉典的数据略作修正(但仍可能存在错误)。有了这两个对照表,下面的工作就简单了。

# 建立拼音辞典

dic_py = dict()

f_py = open('py.txt','r')

content_py = f_py.read()

lines_py = content_py.split('\n')

n=len(lines_py)

for i in range(0,n-1):

word_py,mean_py = lines_py[i].split('\t',1)

dic_py[word_py]=mean_py

f_py.close()

笔顺字典的处理方法也完全相同,虽然文本有两万行,导入还是很快的,0.5秒左右。如果把这两个文件合并起来统一处理,应该可以更快。

# 辞典查找函数

def searchdict(dic,uchar):

if isinstance(uchar,str):

uchar = unicode(uchar,'utf-8')

if uchar >= u'\u4e00' and uchar < = u'\u9fa5':

value=dic.get(uchar.encode('utf-8'))

if value == None:

value = '*'

else:

value = uchar

return value

查找中文,一律转为UTF8字符串,汉字外的其他字符不做处理,原样输出。如果需要声母,只输出拼音的第一个字符就是了。只要资料准确,比较起来就很轻松了。数字在字母之前,爱(ai4)便会比昂(ang2)靠前,而笔顺值的位数代表了笔画数,数值对应笔划权重,直接比较数字大小就可以得到正确的顺序。代码如下:

#比较单个字符

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 'Are you kidding?'

#比较字符串

def comp_char(A,B):

charA = A.decode('utf-8')

charB = B.decode('utf-8')

n=min(len(charA),len(charB))

i=0

while i < n:

dd=comp_char_PY(charA[i],charB[i])

if dd == -1:

i=i+1

if i==n:

dd=len(charA)>len(charB)

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=cnsort(char)

for item in char:

print item.decode('utf-8').encode('gb2312')

终于得到了“李钱佘孙赵”,示例文件点此下载。

这里我没有考虑多音字的情况。如果想让程序自动识别,可以增加多音词组对照表,通过上下文来判断。我不知道哪里有这样的数据,反正对于多音字不太多的情形,手动调整也就够了。

PS:这里再为大家推荐2款比较实用的相关在线排序工具供大家参考使用:

希望本文所述对大家Python程序设计有所帮助。

python编程单词排序_Python实现针对中文排序的方法相关推荐

  1. python汉字排序_Python实现针对中文排序的方法

    本文实例讲述了Python实现针对中文排序的方法.分享给大家供大家参考,具体如下: Python比较字符串大小时,根据的是ord函数得到的编码值.基于它的排序函数sort可以很容易为数字和英文字母排序 ...

  2. python cmd窗口名字_python cmd 窗口 中文乱码 解决方法 (附:打印不同颜色)

    python cmd 窗口 中文乱码 解决方法 (附:打印不同颜色) 前言 在 python 开发中,有时候想通过cmd窗口来和用户交互,比如显示信息之类的,会比自己创建 GUI 来的方便,但是随之而 ...

  3. Python编程对列表中字典元素进行排序的方法详解

    @本文来源于公众号:csdn2299,喜欢可以关注公众号 程序员学府 本文实例讲述了Python编程对列表中字典元素进行排序的方法.分享给大家供大家参考,具体如下: 内容目录: 问题起源 对列表中的字 ...

  4. python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法

    python中函数和方法的区别?Python编程判断当前获取的对象是函数还是方法 目录

  5. Python - Sublime Text 3 控制台不能输出中文的解决方法

    Python - Sublime Text 3 控制台不能输出中文的解决方法 参考文章: (1)Python - Sublime Text 3 控制台不能输出中文的解决方法 (2)https://ww ...

  6. oracle mysql 中文排序规则_ORACLE对中文排序性能优化

    Oracle提供了以下类型的排序方式:(1)二进制排序(2)单语言形式排序(3)多语言形式排序 使用二进制排序排序字符数据的一种方法是基于字符的数值定义的字符编码方案.这就是所谓的二进制排序.二进制排 ...

  7. python常用单词下载_python编程词汇

    python编程词汇app非常实用的词汇辅助工具.python编程词汇app是面向程序开发人员打造的,汇集了各种编程语言备的词汇量,提供视频+语音+画笔+代码的交互的超强真实体验. 基本简介 pyth ...

  8. python编程设计高级_Python编程高级技巧| 选择好的名称

    点击标题下「异步图书」可快速关注 大部分标准库在构建时都要考虑可用性.例如,内置类型的使用是很自然的,其设计非常易于使用.在这种情况下,Python可以与你开发程序时所思考的伪代码进行比较.大部分代码 ...

  9. python编程代码示例_python编程线性回归代码示例

    用python进行线性回归分析非常方便,有现成的库可以使用比如:numpy.linalog.lstsq例子.scipy.stats.linregress例子.pandas.ols例子等. 不过本文使用 ...

最新文章

  1. 交换机和路由器各自的实现原理
  2. 135.003 智能合约后端优化和产品化
  3. 关于easyui中的editIndex
  4. 企业人员管理项目咨询_祝贺直线管理咨询与振野智能营销咨询项目启动
  5. CodeForces - 1312D Count the Arrays(组合数学)
  6. HDR 成像技术学习(一)
  7. 主机挂载存储_备战CKA每日一题——第3天 | 对接CSI存储知识
  8. 乐播投延迟很高_大屏也要高刷新!华为4K@120智慧屏初体验,屏幕软件都够硬
  9. jqGrid专题:jqGrid原理
  10. 哈希码以及Object.toString()简单理解
  11. Listview实现不同类型的布局
  12. 服务器操作系统修复补丁,最后的更新!微软Windows 7发布KB4534310修复补丁
  13. c++基础(上) 听课流水账
  14. 联想主板9针开关接线图_干货丨34个电气控制接线图、电子元件工作原理图
  15. 使用Ffmpeg获取视频编码格式
  16. 最新机器视觉研究团队汇总
  17. Sql Server 本地链接设置 127.0.0.1
  18. office2016和Visio2016安装冲突的解决办法(后附安装包链接)
  19. 计算机财务管理系统的建立,第13章 计算机财务管理系统的建立.ppt
  20. 核心骨干需要具备的能力

热门文章

  1. 【调研】成功的IT公司的老板几乎都是技术出身
  2. python可以构建sem模型_Python Pandas Series.sem()用法及代码示例
  3. 3269: 万水千山粽是情
  4. 2021 区块链行业融资:资本涌入,触发区块链应用的无限可能| 2021 区块链年报|Footprint Analytics
  5. java生气_Java来抢饭碗,C++可别生气
  6. wordpress不同角色显示不同的菜单栏
  7. CAPTCHA(验证码)的来源与作用
  8. 设计一个以1秒频率闪烁的LED灯(亮灭各500ms)
  9. ConnectString中enlist设置的含义
  10. 移动优先和桌面优先的状态