Python 中的各种排序问题
在编写 Python 时,经常需要进行排序操作,简单的 list 排序还是很容易的,碰到复杂的就没办法,只能去查了,现在把编程过程中遇到的所有排序问题列下来,欢迎大家提供更加简洁,高效的排序方法,也欢迎
大家给出自己在 Python 遇到的排序问题.
Python 排序根本依赖于两个内建的函数:
- list.sort () 对 list 成员进行排序,不返回副本
- sorted (list) 对 list 成员进行排序,返回副本
注:以下使用 sorted (list) 进行演示
基本的排序
列表 (list)
按列表元素大小排序
1 | #数值类型 |
规则解释:
- 如果 list 内的元素是字符 / 字符串,默认优先将大写字母排前面,其次再按照规则 2 进行排序;通过参数
key=str.lower
控制其从小字母优先排. - 如果 list 内的元素是字符 / 字符串,将依次按照该字符 / 字符串的 ==ASCCII 值 == 进行排序
- 虽然列表内的元素的类型可以不一样,但是 sotred (list)== 不支持 == 列表中既有数字又有字符的排序
按列表元素的属性
1 | #按列表元素的长度进行排序 |
注:
lambda 为匿名函数,没有函数的具体名称,使用匿名函数是为了使代码更为精简。实际上 lambda str:len(str)
等价于:
1 | def Getlenght(str): |
字典 (dictory)
1 | #对字典进行排序 |
对字典进行排序,实际上是对字典 keys 组成的 list 进行排序,即 sorted (dict)==sorted (sorted.values ())
元组 (tuple) 排序
单个元组排序和列表的方法一样
1 | #元组排序 |
元组列表
1 | >>> tuplist=[('a',1),('c',4),('e',0),('d',2),('f',3)] |
注:直接对元组列表进行排序是按照元组的第一个值进行排序
高级排序
使用 Operator 模块
1 | >>> from operator import itemgetter, attrgetter |
字符串的多关键字排序
基于上面的多关键字排序,可以对字符串做一些有趣的排序,平常我们对字符串进行排序时,可能带有数字,这时候排序只是像平常那样逐个字符串 ASCCII 值 #800023 进行排序:
1 | >>> list01=['dog1','cat3','bird7','swan4','penguin6','cattle5'] |
但是有时候我们需要按照字符串中的字母进行排序,这时候就需要将字符串中的数字切割出来,然后传入 key 参数给 sorted.
1 | #按照字符串的某个数字进行排序 |
如果字符串中类似这样的,而你只想对字符串的某些位置的数字进行排序,我们先来看看只针对字符串一个特定位置的排序.
[‘cb_cha0_amni0’,‘cb_cha0_amni2’,‘cb_cha1_amni1’,‘cb_cha0_amni3’]
使用上面的排序方法得到
1 | >>> list02=['cb_cha0_amni0','cb_cha0_amni2','cb_cha1_amni1','cb_cha0_amni3'] |
上面的自定义提取数字的函数 c=re.findall('\d+',str)[0]
这一句决定了要对字符串的第几个数字进行排序,假设我要对上面字符数组的第二个值进行排序,重新定义一个提取数值的方法,每次调用返回字符串的第二个数字.
1 | >>> def sort_str1(str): |
比较炸的是你的需求是: 按照字符串中的多个字母排序 (比如优先按照第一个字母排序,然后按照第二个字母排序)
一个想法是:把字符串解析为元组,然后使用 itemgetter
来完成多关键字排序.
1 | #字符串已经被拆分为元组 |
注:这里用了匿名函数和多个 map, 这对处理大量的数据是的问题,会耗费很多时间。这种情况比较好的方法是使用 excle 进行排序,当然,你得手动先将数据分割成一列一列的.