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 | 'a',1),('c',4),('e',0),('d',2),('f',3)] tuplist=[( |
注:直接对元组列表进行排序是按照元组的第一个值进行排序
高级排序
使用Operator模块
1 | from operator import itemgetter, attrgetter |
字符串的多关键字排序
基于上面的多关键字排序,可以对字符串做一些有趣的排序,平常我们对字符串进行排序时,可能带有数字,这时候排序只是像平常那样逐个字符串ASCCII值 #800023进行排序:
1 | 'dog1','cat3','bird7','swan4','penguin6','cattle5'] list01=[ |
但是有时候我们需要按照字符串中的字母进行排序,这时候就需要将字符串中的数字切割出来,然后传入key参数给sorted.
1 | #按照字符串的某个数字进行排序 |
如果字符串中类似这样的,而你只想对字符串的某些位置的数字进行排序,我们先来看看只针对字符串一个特定位置的排序.
[‘cb_cha0_amni0’,‘cb_cha0_amni2’,‘cb_cha1_amni1’,‘cb_cha0_amni3’]
使用上面的排序方法得到
1 | 'cb_cha0_amni0','cb_cha0_amni2','cb_cha1_amni1','cb_cha0_amni3'] list02=[ |
上面的自定义提取数字的函数c=re.findall('\d+',str)[0]
这一句决定了要对字符串的第几个数字进行排序,假设我要对上面字符数组的第二个值进行排序,重新定义一个提取数值的方法,每次调用返回字符串的第二个数字.
1 | def sort_str1(str): |
比较炸的是你的需求是:按照字符串中的多个字母排序(比如优先按照第一个字母排序,然后按照第二个字母排序)
一个想法是:把字符串解析为元组,然后使用itemgetter
来完成多关键字排序.
1 | #字符串已经被拆分为元组 |
注:这里用了匿名函数和多个map,这对处理大量的数据是的问题,会耗费很多时间.这种情况比较好的方法是使用excle进行排序,当然,你得手动先将数据分割成一列一列的.