小书匠python排序

本章目录,快速浏览所需内容:


在编写Python时,经常需要进行排序操作,简单的list排序还是很容易的,碰到复杂的就没办法,只能去查了,现在把编程过程中遇到的所有排序问题列下来,欢迎大家提供更加简洁,高效的排序方法,也欢迎

大家给出自己在Python遇到的排序问题.

Python排序根本依赖于两个内建的函数:

  • list.sort() 对list成员进行排序,不返回副本
  • sorted(list) 对list成员进行排序,返回副本

注:以下使用sorted(list)进行演示

基本的排序

1.列表(list)

1.1按列表元素大小排序

  1. #数值类型 

  2. >>> sorted([1,6,3,2,5,7,4]) 

  3. [1, 2, 3, 4, 5, 6, 7] 


  4. #字符类型 

  5. >>> sorted(['a','d','e','b','f','c']) 

  6. ['a', 'b', 'c', 'd', 'e', 'f'] 


  7. #字符串类型 

  8. >>> sorted(['a','ad','ada','ad1','abe','b','f','c']) 

  9. ['a', 'abe', 'ad', 'ad1', 'ada', 'b', 'c', 'f'] 


  10. #字符串中包含大小写 

  11. >>> sorted(['a','ad','ada','A','ad1','abe','Abe','b','f','c']) 

  12. ['A', 'Abe', 'a', 'abe', 'ad', 'ad1', 'ada', 'b', 'c', 'f'] 


  13. #小写字母优先 

  14. >>> sorted(['a','ad','ada','A','ad1','abe','Abe','b','f','c'],key=str.lower) 

  15. ['a', 'A', 'abe', 'Abe', 'ad', 'ad1', 'ada', 'b', 'c', 'f'] 

规则解释:

  1. 如果list内的元素是字符/字符串,默认优先将大写字母排前面,其次再按照规则2进行排序;通过参数key=str.lower控制其从小字母优先排.
  2. 如果list内的元素是字符/字符串,将依次按照该字符/字符串的ASCCII值进行排序
  3. 虽然列表内的元素的类型可以不一样,但是sotred(list)不支持列表中既有数字又有字符的排序

1.2按列表元素的属性

  1. #按列表元素的长度进行排序 

  2. sorted(['a','ad','ada','A','ad1','abe','Abe','b','f','c'],key=lambda str:len(str)) 

  3. ['a', 'A', 'b', 'f', 'c', 'ad', 'ada', 'ad1', 'abe', 'Abe'] 

注:

lambda为匿名函数,没有函数的具体名称,使用匿名函数是为了使代码更为精简.实际上lambda str:len(str)等价于:

  1. def Getlenght(str): 

  2. return len(str) 

2.字典(dictory)

  1. #对字典进行排序 

  2. >>> sorted({1: 'D', 5: 'B', 2: 'B', 4: 'E', 3: 'A'}) 

  3. [1, 2, 3, 4, 5] 


  4. #按照字典中的values的大小进行排序 

  5. >>> dict 

  6. {1: 'DE', 2: 'DDDB', 3: 'A', 4: 'QPOIE', 5: 'WWB'} 

  7. >>> dict.items() 

  8. dict_items([(1, 'DE'), (2, 'DDDB'), (3, 'A'), (4, 'QPOIE'), (5, 'WWB')]) 

  9. >>> sorted(dict.items(),key=lambda value:value[1]) 

  10. [(3, 'A'), (2, 'DDDB'), (1, 'DE'), (4, 'QPOIE'), (5, 'WWB')] 


  11. #按照字典中的values的长度进行排序 

  12. >>> sorted(dict.items(),key=lambda value:len(value[1])) 

  13. [(3, 'A'), (1, 'DE'), (5, 'WWB'), (2, 'DDDB'), (4, 'QPOIE')] 

对字典进行排序,实际上是对字典keys组成的list进行排序,即sorted(dict)==sorted(sorted.values())

3.元组(tuple)排序

3.1单个元组排序和列表的方法一样

  1. #元组排序 

  2. >>> tup1=(1,5,3,4,2,7,6) 

  3. >>> sorted(tup1) 

  4. [1, 2, 3, 4, 5, 6, 7] 

  5. >>> tup2=('a','d','f','b','e','c') 

  6. >>> sorted(tup2) 

  7. ['a', 'b', 'c', 'd', 'e', 'f'] 

3.2元组列表

  1. >>> tuplist=[('a',1),('c',4),('e',0),('d',2),('f',3)] 

  2. >>> student_tuples = [('john', 'A', 15),('jane', 'B', 12),('dave', 'B', 10),] 

  3. >>>  

  4. #直接对元组列表进行排序 

  5. >>> sorted(tuplist) 

  6. [('a', 1), ('c', 4), ('d', 2), ('e', 0), ('f', 3)] 


  7. #按照元组的第某个值进行排序 

  8. >>> sorted(tuplist,key=lambda tup:tup[1]) 

  9. [('e', 0), ('a', 1), ('d', 2), ('f', 3), ('c', 4)] 


  10. #按照元组的第某个值进行排序 

  11. >>> sorted(student_tuples, key=lambda student: student[2]) 

  12. [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] 

注:直接对元组列表进行排序是按照元组的第一个值进行排序

高级排序

1.使用Operator模块

  1. >>> from operator import itemgetter, attrgetter 


  2. #一个排序关键字 

  3. >>> sorted(student_tuples, key=itemgetter(2)) 

  4. [('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)] 


  5. #两个排序关键字 

  6. >>> sorted(student_tuples, key=itemgetter(1,2)) 

  7. [('john', 'A', 15), ('dave', 'B', 10), ('jane', 'B', 12)] 

2.字符串的多关键字排序

基于上面的多关键字排序,可以对字符串做一些有趣的排序,平常我们对字符串进行排序时,可能带有数字,这时候排序只是像平常那样逐个字符串ASCCII值进行排序:

  1. >>> list01=['dog1','cat3','bird7','swan4','penguin6','cattle5'] 


  2. #字符串排序 

  3. >>> sorted(list01) 

  4. ['bird7', 'cat3', 'cattle5', 'dog1', 'penguin6', 'swan4'] 

但是有时候我们需要按照字符串中的字母进行排序,这时候就需要将字符串中的数字切割出来,然后传入key参数给sorted.

  1. #按照字符串的某个数字进行排序 

  2. >>> import re 

  3. >>> def sort_str(str): 

  4. if str: 

  5. try: 

  6. c=re.findall('\d+',str)[0] 

  7. except: 

  8. c=-1 

  9. return int(c) 


  10. >>> sorted(list01,key=sort_str) 

  11. ['dog1', 'cat3', 'swan4', 'cattle5', 'penguin6', 'bird7'] 

如果字符串中类似这样的,而你只想对字符串的某些位置的数字进行排序,我们先来看看只针对字符串一个特定位置的排序.

['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'] 

  2. >>> sorted(list02,key=sort_str) 

  3. ['cb_cha0_amni0', 'cb_cha0_amni2', 'cb_cha0_amni3', 'cb_cha1_amni1'] 

上面的自定义提取数字的函数c=re.findall('\d+',str)[0]这一句决定了要对字符串的第几个数字进行排序,假设我要对上面字符数组的第二个值进行排序,重新定义一个提取数值的方法,每次调用返回字符串的第二个数字.

  1. >>> def sort_str1(str): 

  2. if str: 

  3. try: 

  4. c=re.findall('\d+',str)[1] 

  5. except: 

  6. c=-1 

  7. return int(c) 


  8. >>> sorted(list02,key=sort_str1) 

  9. ['cb_cha0_amni0', 'cb_cha1_amni1', 'cb_cha0_amni2', 'cb_cha0_amni3'] 

比较炸的是你的需求是:按照字符串中的多个字母排序(比如优先按照第一个字母排序,然后按照第二个字母排序)

一个想法是:把字符串解析为元组,然后使用itemgetter来完成多关键字排序.

  1. #字符串已经被拆分为元组 

  2. >>> list03=[('cb_cha',0,'_amni',0),('cb_cha',1,'_amni',1),('cb_cha',0,'_amni',2),('cb_cha',0,'_amni',3)] 


  3. #对元祖进行多关键字排序 

  4. >>> listtmp=sorted(list03, key=itemgetter(1,3)) 

  5. >>> listtmp 

  6. [('cb_cha', 0, '_amni', 0), ('cb_cha', 0, '_amni', 2), ('cb_cha', 0, '_amni', 3), ('cb_cha', 1, '_amni', 1)] 


  7. #将排序后的元组转成字符串 

  8. >>> list(map(lambda strtmp:''.join(map(str,strtmp)),listtmp)) 

  9. ['cb_cha0_amni0', 'cb_cha0_amni2', 'cb_cha0_amni3', 'cb_cha1_amni1'] 


注:这里用了匿名函数和多个map,这对处理大量的数据是的问题,会耗费很多时间.这种情况比较好的方法是使用excle进行排序,当然,你得手动先将数据分割成一列一列的.


EXCLE的自定义排序

Python中的各种排序问题的更多相关文章

  1. 对Python中函数参数类型及排序问题,三个方面的总结

    Python中函数的参数问题有点复杂,主要是因为参数类型问题导致的情况比较多,下面来分析一下. 参数类型:缺省参数,关键字参数,不定长位置参数,不定长关键字参数. 其实总共可以分为 位置参数和关键字参 ...

  2. (四)Python中的“四大才子”(字符串、列表、字典、集合)

    前戏:在python中把数据序列分为可变(mutable)和不可变(immutable)两种 不可变:string.int.float.tuple 特点:相同对象只是占用一个内存地址,不管有多少个变量 ...

  3. Python中使用operator模块实现对象的多级排序

    Python中使用operator模块实现对象的多级排序 今天碰到一个小的排序问题,需要按嵌套对象的多个属性来排序,于是发现了Python里的operator模块和sorted函数组合可以实现这个功能 ...

  4. python中os.listdir( )函数读取文件夹

    编写pytohn脚本时通常需要批处理. 列出指定目录下的所有文件/文件夹 os.listdir() 方法用于返回指定的文件夹包含的文件或文件夹的名字的列表,但有个很明显的缺点,它的默认顺序不是有序的或 ...

  5. [转]Python中的str与unicode处理方法

    早上被python的编码搞得抓耳挠腮,在搜资料的时候感觉这篇博文很不错,所以收藏在此. python2.x中处理中文,是一件头疼的事情.网上写这方面的文章,测次不齐,而且都会有点错误,所以在这里打算自 ...

  6. python中的Ellipsis

    ...在python中居然是个常量 print(...) # Ellipsis 看别人怎么装逼 https://www.keakon.net/2014/12/05/Python%E8%A3%85%E9 ...

  7. python中的默认参数

    https://eastlakeside.gitbooks.io/interpy-zh/content/Mutation/ 看下面的代码 def add_to(num, target=[]): tar ...

  8. Python中的类、对象、继承

    类 Python中,类的命名使用帕斯卡命名方式,即首字母大写. Python中定义类的方式如下: class 类名([父类名[,父类名[,...]]]): pass 省略父类名表示该类直接继承自obj ...

  9. python中的TypeError错误解决办法

    新手在学习python时候,会遇到很多的坑,下面来具体说说其中一个. 在使用python编写面向对象的程序时,新手可能遇到TypeError: this constructor takes no ar ...

随机推荐

  1. 在论坛中出现的比较难的sql问题:29(row_number函数 组内某列的值连续出现3次标记出来)

    原文:在论坛中出现的比较难的sql问题:29(row_number函数 组内某列的值连续出现3次标记出来) 在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘 ...

  2. javascript 之 扩展对象

    注意点:在js中常见的几种方进行扩展 第一种:ES6提供的 Object.assign(); 第二种:ES5提供的 extend()方法 第三种:Object对象提供的 defineProperty( ...

  3. VS2015编译Teamtalk的Windows客户端(转)

    原文链接:https://blog.csdn.net/qtstar/article/details/54732581 一.(首先要把teamtalk整个项目download下来或git一个副本下来)打 ...

  4. flask/app.py-add_url_rule源码分析

    之前分析route方法的时候,可以看到中间会调用add_url_rule方法,add_url_rule方法和route方法一样属于Flask这个类的. add_url_rule方法主要用来连接url规 ...

  5. 1+x证书学习日志——css 基本选择符

    ##css选择符                 1:类型选择符 直接用标签名称当作选择符                     特点:选中所有同类元素                 2:id名称 ...

  6. iOS自动布局学习(UIView+AutoLayout)

    自动布局虽然在iOS6的时候已经推出,不过由于各个原因并没有被开发组广泛使用.一方面是大家的app支持版本都是低于iOS6的,另一方面来说是Xcode支持木有现在这么好.以前由于iPhone设备相对固 ...

  7. ping IP 带时间戳循环显示并写入日志(windos版+linux版)

    在工作中,判断网络是否通畅,首选命令就是ping,但有时候我们需要持续ping一个或多个地址时,需要加 -t 即可,但有时候需要在ping的时候加入时间戳并把ping记录写入到日志里面,方法如下: w ...

  8. centos iptables 数据转发

    iptables -t nat -I PREROUTING -p tcp --dport 3389 -j DNAT --to 38.X25.X.X02 iptables -t nat -I POSTR ...

  9. Nginx突破高并发的性能优化 - 运维笔记

    在日常的运维工作中,经常会用到nginx服务,也时常会碰到nginx因高并发导致的性能瓶颈问题.今天这里简单梳理下nginx性能优化的配置(仅仅依据本人的实战经验而述,如有不妥,敬请指出~) 一.这里 ...

  10. G1垃圾收集器角色划分与重要概念详解【纯理论】

    继续接着上一次[https://www.cnblogs.com/webor2006/p/11129326.html]对G1进行理论化的学习,上一次学到了G1收集器的堆结构,回忆下: 接着继续对它进行了 ...