综述
在python编程中我们通常会对一个列表中的元素进行排序,而排序最为常用的自然就是列表自带的函数sort()了。
经常使用Python的朋友肯定知道sort()函数默认是按照将列表中的元素进行从小到大排序的,这其实只是初步的认识。
数值比较
有一定计算机基础的朋友会想到更深一层的知识,你会想到我们平时列表中的数值到底是怎么排序的?当然,我们马上会想到排序的算法。排序算法的核心就是数值大小的比较,再深入就是具体到哪个排序算法了。
能想到以上知识的同学已经算是很不错的了哦!
字母字符比较
在多次实践中,我们的排序其实不仅会涉及用到数值,还会使用到字母的排序,当然有一定计算机基础的同学马上会想到比较的本质还是数值大小的比较,同时会想到字符串或者字符会将字母转为ascii码,然后使用数值进行大小比较。是的,能实践到字母比较的同学已经挺厉害的了哦!
这里顺便献上ascii码对照表给您!放大查看哦!
是的,常用字母和符号的大小比较和排序,本质就是根据以上ASCII码表来实行的。那么中文怎么办呢?
中文字符比较
为了解决各国文字不同并且ascii码因只有128个字符而不够用的问题,国际联合组织就协定了一个国际通用的utf-8的编码格式。这个编码格式厉害了,在各国文字不同的情况下,字符仍然不会出现错误转换的问题。这就是unicode编码的出现了。
unicode编码其实也是有一个字符和数值对照表的,但是这个表实在太大,不太好展示,但是学习过刘金玉编程的同学却是可以通过for循环以及字符和数值转换函数的结合使用,就能轻易做到输出这个对照表了。
我们先来看一下以上我的名字组成的字符,为什么会在排序时出现颠倒的效果?
我们先对字符做一下比较看看:
我们发现‘玉’比‘金’大,结果是false(为假),所以其实应该是‘玉’小于等于‘金’这个字符。
第二条测试中‘玉’比‘金’要小(为真)。
从以上两条测试中,我们发现,中文的比较,其实在本质上应该也是一个数值大小的比较,那么这个数值大小该怎么看呢?
需要通过ord函数观察。
我们这里分别对‘刘金玉’这三个字符做一个字符与数值对照的转换。
通过以上转换的结果,我们就可以对sort()函数排序的结果一目了然了。本质上就是利用的是unicode字符转换的数值排序。
是啊!中文字符在国际通用的utf-8编码中也是有对应的数值大小的。
这里要注意的是,我们当前使用的Python环境默认是使用什么编码格式比较重要。一般来说都是utf-8编码格式,当然也不排除意外,所以大家最好通过导入sys库,利用getdefaultencoding()函数去获取一下编码环境的情况。
可以用以下代码:
>>> import sys
>>> sys.getdefaultencoding()
'utf-8'
这样我就得到了当前环境的编码格式了。
unicode编码与区位码
值得我们注意的是unicode编码和区位码有所不同。我们用的unicode编码是针对国际交流使用的编码格式,而区位码则是针对中文的gb2312编码格式的数值,它们是有所不同的,当然也有一定的算法可以转换,感兴趣的朋友可以搜索gbk_convert_to_utf8关键词可以看到一些相关的算法和代码书写。