最近项目需要对一些条目进行排序,这些条目都是汉字词组,使用Python传统的.sort,或sorted都失败了,原因很简单,汉字编码和字母编码根本就不是一回事,汉字的编码顺序并非按照拼音和笔画顺序大小排序。因此在排序时需要借助拼音编码对照表和笔画对照表。
基本原理
假设输入为汉字字符串数组,还是按照最简单的排序原理。这里的的大小依据是就是拼音对照表中的编码值和笔画对照表中的编码值。先按拼音比较,如果拼音编码值相等,则比较其笔画编码。对于两个多汉字单词的比较,先比较首单词,若相同在比较第二个单词,以此类推。
直接上代码,附注释
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)
结果: