Python 中文排序
2017-07-11 本文已影响303人
vola_lei
最近项目需要对一些条目进行排序,这些条目都是汉字词组,使用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