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

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

True

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

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

True True

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

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

1

2

3

4

5

# encoding=utf8

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

char.sort()

for item in char:

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

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

1

2

3

4

5

# encoding=gb2312

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

char.sort()

for item in char:

print item

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

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

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

我找到最全的数据是slowwind9999上传到csdn的unicode汉字编码表,包括全部20902个汉字的全拼、五笔、郑码、UNICODE、GBK、笔画数 部首,以及笔顺编号(拼音部分没有音调,而且个别注音有误,如 囍,猤,啹等字,使用需注意。)我提取了其中的笔顺数据,又用江志键的“实用汉字转拼音”程序制作了unicode汉字音调版,其中中文汉字用四声标注,319个日韩汉字没有音调以示区别,并根据汉典的数据略作修正(但仍可能存在错误)。有了这两个对照表,下面的工作就简单了。

1

2

3

4

5

6

7

8

9

10

# 建立拼音辞典

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秒左右。如果把这两个文件合并起来统一处理,应该可以更快。

1

2

3

4

5

6

7

8

9

10

11

# 辞典查找函数

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)靠前,而笔顺值的位数代表了笔画数,数值对应笔划权重,直接比较数字大小就可以得到正确的顺序。代码如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

#比较单个字符

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

现在我们就可以按照字典的规范给中文排序了。

1

2

3

4

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

char=cnsort(char)

for item in char:

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

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

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

python汉字排序_Python中文排序(转载)相关推荐

  1. python汉字排序规则_Python 中文排序

    我找到最全的数据是slowwind9999上传到csdn的unicode汉字编码表,包括全部20902个汉字的全拼.五笔.郑码.UNICODE.GBK.笔画数 部首,以及笔顺编号(拼音部分没有音调,而 ...

  2. python set 排序_python set 排序_如何在Python中使用sorted()和sort()

    点击"蓝字"关注我们 ?"Python基础知识" 大卫·丰达科夫斯基  著 18财税3班 李潇潇    译 日期:2019年5月6日 一. 使用sorted() ...

  3. python程序字符串中字符排序_python字符串排序方法

    本文以实例形式简述了Python实现字符串排序的方法,是Python程序设计中一个非常实用的技巧.分享给大家供大家参考之用.具体方法如下: 一般情况下,python中对一个字符串排序相当麻烦: 一.p ...

  4. python数字排序_python数字排序

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 例如,你想要按照名字来对一列团队成员名单进行排序,或者想按照优先级来对一列项目进 ...

  5. python列表反向排序_Python 列表排序方法reverse、sort、sorted详解

    python语言中的列表排序方法有三个:reverse反转/倒序排序.sort正序排序.sorted可以获取排序后的列表.在更高级列表排序中,后两中方法还可以加入条件参数进行排序. reverse() ...

  6. 用python写希尔排序_python希尔排序介绍(实例)

    希尔排序介绍 希尔排序(Shell Sort)是插入排序的一种.也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本,该方法的基本思想是:先将整个待排元素序列分割成若干个子序列(由相隔某个&qu ...

  7. Java对象排序、中文排序、SortedSet排序使用和源码讲解

    在C.C++中有很多排序算法,但是通常排序算法不得不让程序员在写代码的过程中陷入对底层很多指针和位置的理解,Java不希望这样,所以排序大多可以由java帮你做掉,例如,你要对一个数组排序,就通过:C ...

  8. python中文词频排序_Python中文词频统计

    1. 下载一长篇中文小说. 2. 从文件读取待分析文本. 3. 安装并使用jieba进行中文分词. pip install jieba import jieba ljieba.lcut(text) i ...

  9. python文件信息排序_python文件排序的方法总结

    在python环境中提供两种排序方案:用库函数sorted()对字符串排序,它的对象是字符:用函数sort()对数字排序,它的对象是数字,如果读取文件的话,需要进行处理(把文件后缀名'屏蔽'). (1 ...

  10. python中用def实现自动排序_Python sorted排序方法如何实现

    在给列表排序时,sorted非常好用,语法如下: sorted(iterable[, cmp[,key[,reverse]]]) sorted定义如下: sorted( iterable[, cmp[ ...

最新文章

  1. 做产品最怕得是没有人负责
  2. 分库分表的几种常见形式以及可能遇到的难题--转
  3. Spring Cloud【Finchley】-03将微服务注册到Eureka Server上 + 为Eureka Server添加用户认证
  4. 【新星计划】Linux命令行相关指令汇总
  5. Java学习之动态代理
  6. 为什么 C++ 中提倡尽量避免使用宏 #define(转)
  7. Linux移植随笔 tslib
  8. mysql mode_mysql中的sql_mode
  9. 深入理解Spring异常处理
  10. 这8种保证线程安全的技术你都知道吗?
  11. mysql5.6开启binlog日志
  12. R语言中管道操作 %%, %T%, %$% 和 %%
  13. PreparedStatement详解
  14. C# - Poker Sort
  15. 深度数据全方位解析:冰桶挑战---TOMsInsight 2014.08.20
  16. php 商户转账到微信零钱
  17. 如何解决MacBook休眠时耗电过大的问题
  18. [Sensor]LSM6DSL-加速度计、陀螺仪传感器
  19. java获取百度实时天气(无限制)
  20. 创建菜单栏、菜单、菜单项

热门文章

  1. Delphi7中利用定时器和TRzProgressBar去显示进度条
  2. linux多线程如何分配到多核上,Linux多线程编程 多核编程
  3. 二维联合分布(X,Y)求(U,V)
  4. linux常用下载工具
  5. Java jar 包免费下载(全)
  6. 笔记之_Java整理IO流
  7. 西门子PLC控制器家族产品汇总
  8. 老男孩linux高端运维课程—linux系统目录结构知识讲解
  9. linkedin第三方登陆
  10. 蚂蚁课堂笔记之 spring详解