最近項目需要對一些條目進行排序盏浙,這些條目都是漢字詞組眉睹,使用Python傳統(tǒng)的.sort,或sorted都失敗了,原因很簡單废膘,漢字編碼和字母編碼根本就不是一回事竹海,漢字的編碼順序并非按照拼音和筆畫順序大小排序。因此在排序時需要借助拼音編碼對照表和筆畫對照表丐黄。
基本原理
假設(shè)輸入為漢字字符串?dāng)?shù)組斋配,還是按照最簡單的排序原理。這里的的大小依據(jù)是就是拼音對照表中的編碼值和筆畫對照表中的編碼值孵稽。先按拼音比較许起,如果拼音編碼值相等,則比較其筆畫編碼菩鲜。對于兩個多漢字單詞的比較园细,先比較首單詞,若相同在比較第二個單詞接校,以此類推猛频。
直接上代碼狮崩,附注釋
# 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
###############################
# 辭典查找函數(shù)
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])
# 如果第一個單詞相等睦柴,就繼續(xù)比較下一個單詞
if dd == -1:
i=i+1
# 如果比較到頭了
if i==n:
dd=len(A)>len(B)
else:
break
return dd
# 排序函數(shù)
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)
結(jié)果:
image.png