python中⽂姓名排序_Python实现针对中⽂排序的⽅法
本⽂实例讲述了Python实现针对中⽂排序的⽅法。分享给⼤家供⼤家参考,具体如下:
Python⽐较字符串⼤⼩时,根据的是ord函数得到的编码值。基于它的排序函数sort可以很容易为数字和英⽂字母排序,因为它们在编码表中就是顺序排列的。
但要很处理中⽂就没那么容易了。中⽂通常有拼⾳和笔画两种排序⽅式,在最常⽤中⽂标准字符集GB2312中,3755个⼀级中⽂汉字是按照拼⾳序进⾏编码的,⽽3008个⼆级汉字则是按部⾸笔画排列,
出现这样的结果是因为‘曙'和‘曾'都是常⽤字,⽽‘鲑'和‘怡'都是次常⽤字,但⽆论从笔画还是拼⾳来看,这两对顺序都应该反过来。后来扩充的GBK和GB18030编码为了向下兼容,都没有更改之前的汉字顺序,于是sort之后的次序就很乱了。
另⼀⽅⾯unicode编码的中⽂是按《康熙字典》的偏旁部⾸和笔画数来排列的,所以排序结果和GB编码⼜不⼀样。
输出是:"佘孙李赵钱";⽽保存成gb2312编码后
输出是:“李钱孙赵佘”。显然,这两个结果都不是我们想要的。那我们究竟怎样才能对中⽂正确排序呢?
先要弄清楚中⽂词典的排序规则:先按拼⾳排列,区分四声,拼⾳相同的就看笔画数⽬多少,笔画数也相同的再按笔顺中的具体笔划类型来区分,新华字典采⽤的顺序是⼀⼁⼃⼂⼄,也称作“天上⼈间”,应该没有笔划类型也完全⼀样的。所以中⽂排序不仅需要带⾳调的汉字拼⾳对照表,还需要有具体笔顺的数据。
本以为有现成的模块,试了⼏个都不理想。pyzh的转换代码只⽀持不到7千字,⽽且还没有⾳调。⽔⽊的roy的代码涵盖了2万多字符,但需要pysqlite⽀持......还是⾃⽴更⽣吧~
我到最全的数据是slowwind9999上传到csdn的unicode汉字编码表(点击此处本站下载。),包括全部20902个汉字的全拼、五笔、郑码、UNICODE、GBK、笔画数 部⾸,以及笔顺编号(拼⾳部分没有⾳调,⽽且个别注⾳有误,如 囍,猤,啹等字,使⽤需注意。)我提取了其中的笔顺数据,⼜⽤江志键的“实⽤汉字转拼⾳”程序制作了unicode汉字⾳调版,其中中⽂汉字⽤四声标注,319个⽇韩汉字没有⾳调以⽰区别,并根据汉典的数据略作修正(但仍可能存在错误)。有了这两个对照表,下⾯的⼯作就简单了。
笔顺字典的处理⽅法也完全相同,虽然⽂本有两万⾏,导⼊还是很快的,0.5秒左右。如果把这两个⽂件合并起来统⼀处理,应该可以更快。
查中⽂,⼀律转为UTF8字符串,汉字外的其他字符不做处理,原样输出。如果需要声母,只输出拼
⾳的第⼀个字符就是了。只要资料准确,⽐较起来就很轻松了。数字在字母之前,爱(ai4)便会⽐昂(ang2)靠前,⽽笔顺值的位数代表了笔画数,数值对应笔划权重,直接⽐较数字⼤⼩就可以得到正确的顺序。代码如下:
现在我们就可以按照字典的规范给中⽂排序了。
终于得到了“李钱佘孙赵”,⽰例⽂件点此下载。
unicode汉字这⾥我没有考虑多⾳字的情况。如果想让程序⾃动识别,可以增加多⾳词组对照表,通过上下⽂来判断。我不知道哪⾥有这样的数据,反正对于多⾳字不太多的情形,⼿动调整也就够了。
希望本⽂所述对⼤家Python程序设计有所帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论