设为首页 收藏本站
查看: 760|回复: 0

[经验分享] 转:Python排序

[复制链接]

尚未签到

发表于 2017-4-22 10:17:36 | 显示全部楼层 |阅读模式
1.字符串列表排序
列表的排序是python内置功能,自身含有sort方法 。如果元素是字符串,会分解成字符比较,而字符的大小是根据字符对应ascii码的大小。
Python代码   DSC0000.png


  • >>> str_list = ['spring''summer''autumn''winter']  
  • >>> str_list.sort()  
  • >>> print str_list  
  • ['autumn''spring''summer''winter']  

 
Python代码  


  • >>> str_list = ['aB''Ab''AB''ab']  
  • >>> str_list.sort()  
  • >>> print str_list  
  • ['AB''Ab''aB''ab']  

 
Python代码  


  • >>> str_list = ['a123''B123''c123']  
  • >>> str_list.sort()  
  • >>> print str_list  
  • ['B123''a123''c123']  

 如果忽略大小字母,让上面结果显示为:['a123', 'B123', 'c123']。怎么做了?
 
很容易想到DSU用法,decorate-sort-undecorate封装-排序-解封,既简单又快速:
Python代码  


  • >>> str_list = ['c123''a123''B123']  
  • >>> temp_list = [(x.lower(), x) for x in str_list]  #decorate  
  • >>> temp_list.sort()  #sort  
  • >>> str_list = [x[1] for x in temp_list]  #undecorate  
  • >>> print str_list  
  • ['a123''B123''c123']  

这是一种重要的编程思想,你现在所处的情景,你想要的结果,你要做的就是搭一座桥梁,让两者之间可以联通!这是的桥梁就是temp_list。
 
如果你确定列表中的元素都是字符串,而且你使用的是Python2.4以上版本,那么使用sorted方法来得更简单:
Python代码  


  • >>> str_list = ['c123''a123''B123']  
  • >>> sorted(str_list, key=str.lower)  
  • >>> str_list = sorted(str_list, key=str.lower)  
  • ['a123''B123''c123']  

 这里我提示一点sorted方法并没有直接作用于目标列表,而是返回一个排序后的列表。如果你知道排序的是unicode对象列表,可以使用key=unicode.lower,或者key = lambda s: s.lower()
 
这里给你补充点知识:
        python有三种字符串类型:str、unicode、basestring。basestring是抽象类,不能实例化,str和unicode是basestring的子类。普通字符串str怎么转换为Unicode字符串?'Hello'+u' '+'World'   这样就行了,连接中有一个是unicode字符串,结果都为unicode字符串。如果你想知道得更详细,我会写另一篇文章。
        lambda 是匿名函数,python中非常有用的一个函数,掌握它对你受益匪浅。
 
这里你会不禁赞叹python的强大,简单而且优美。程序就是一件艺术品,python无疑是一把优质的雕琢刀,而你的地位恰好是雕塑家。成功与否,不是取决于雕琢刀的好坏,而是你雕刻的方法,这正是我们应该学习的!
 
也许上面两种方法你都没有想到,你想到的是:难道不能重新构造比较方法cmp()吗?
Python代码  


  • >>> def mycmp(a, b):  
  •     return cmp(a.lower(), b.lower())  
  •   
  • >>> str_list = ['c123''a123''B123']  
  • >>> str_list.sort(mycmp)  
  • >>> print str_list  
  • ['a123''B123''c123']  

 不知你发现没有,每两个元素进行比较都会执行两次lower()方法,如果列表中元素为n,那要执行多少次lower()?虽然不推荐这样做,但也给我们提供了一种思路,如果不是字符串列表,而是结构很复杂的数据列表,我们就可以采用这样方法!
2.数字列表排序
Python代码  


  • >>> num_list = [12, 43, 11, 23, 9]  
  • >>> num_list.sort()  
  • >>> print num_list  
  • [9, 11, 12, 23, 43]  

 小数也同样适用
Python代码  


  • >>> num_list = [12, 43.4, 11.5, 23.0, 9.1]  
  • >>> num_list.sort()  
  • >>> print num_list  
  • [9.1, 11.5, 12, 23.0, 43.4]  

 我用的是Python2.7,如果你使用是其他版本,可能会出现不同的结果,如:9.1变成9.100000000001 。这涉及到python中小数是怎么存储的,这里就不多说了!
 
3.字典数据排序
学Java的人都知道Map,而字典就是Python中的“Map”,键值对映射。字典中元素的存储是无序的,怎么对字典数据进行排序?
Python代码  


  • >>> mydict = {"A01":"first""A14":"second""Aa1":"third"}  
  • >>> print mydict  
  • {'A14''second''A01''first''Aa1''third'}  
  • >>> items = mydict.items()  
  • >>> print items  
  • [('A14''second'), ('A01''first'), ('Aa1''third')]  
  • >>> items.sort()  
  • >>> print items  
  • [('A01''first'), ('A14''second'), ('Aa1''third')]  
  • >>> new_list = [value for key, value in items]  
  • >>> print new_list  
  • ['first''second''third']  

 前3行说明字典中元素存储是无序的,你构造的字典和实际存储的字典 里元素的顺序并不一样!字典的items()方法能够把字典转换为元组的列表,再对元组列表进行排序,得到自己想要的结果。
 
另一种思路:得到字典key列表,排序后,依次取出value,构造成列表就是你的结果。
Python代码  


  • >>> mydict = {"A01":"first""A14":"second""Aa1":"third"}  
  • >>> keys = mydict.keys()  
  • >>> keys.sort()  
  • >>> new_list = [mydict[key] for key in keys]  
  • >>> print new_list  
  • ['first''second''third']  

 通过映射的方法更有效的执行最后一步
Python代码  


  • >>> mydict = {"A01":"first""A14":"second""Aa1":"third"}  
  • >>> keys = mydict.keys()  
  • >>> keys.sort()  
  • >>> new_list = map( mydict.get,keys )  
  • >>> print new_list  
  • ['first''second''third']  

 利用lamdba函数,选择根据key或value排序
Python代码  


  • >>> sorted(mydict.items(), key=lambda d:d[0])  
  • [('A01''first'), ('A14''second'), ('Aa1''third')]  
  • >>> mydict = {"A01":"first""A14":"second""Aa1":"third"}  
  • >>> sorted(mydict.items(), key=lambda d:d[0])  
  • [('A01''first'), ('A14''second'), ('Aa1''third')]  
  • >>> sorted(mydict.items(), key=lambda d:d[1])  
  • [('A01''first'), ('A14''second'), ('Aa1''third')]  
  • >>> print mydict  
  • {'A14''second''A01''first''Aa1''third'}  

 
4.对象排序
 
Python代码  


  • >>> class Sortobj:  
  •     a = 0  
  •     b = ''  
  •     def __init__(self, a, b):  
  •         self.a = a  
  •         self.b = b  
  •     def printab(self):  
  •         print self.a, self.b  
  •   
  •           
  • >>> obja = Sortobj(343, 'keen')  
  • >>> objb = Sortobj(56, 'blue')  
  • >>> objc = Sortobj(2, 'aba')  
  • >>> objd = Sortobj(89, 'iiii')  
  • >>> obj_list = [obja, objb, objc, objd]  
  • >>> for obj in obj_list:  
  •     obj.printab()  
  •   
  •       
  • 343 keen  
  • 56 blue  
  • 2 aba  
  • 89 iiii  
  • >>> obj_list.sort(lambda x,y: cmp(x.a, y.a)) #按对象的a属性进行排序  
  • >>> for obj in obj_list:  
  •     obj.printab()  
  •   
  •       
  • 2 aba  
  • 56 blue  
  • 89 iiii  
  • 343 keen  
  • >>> obj_list.sort(lambda x,y: cmp(x.b, y.b)) #按对象的b属性进行排序  
  • >>> for obj in obj_list:  
  •     obj.printab()  
  •   
  •       
  • 2 aba  
  • 56 blue  
  • 89 iiii  
  • 343 keen  

 
5.字典列表排序
元素全是字典的列表,如何排序?其实把上面的方法综合起来就能实现:
Python代码  


  • input = [{'name''Homer''age': 39}, {'name''Bart''age':10},{'name''Wang''age':10},{'name''Ab''age':10}]  
  • print input  
  • input.sort(lambda x,y : cmp(x['name'], y['name']))   
  • print input  

如果想降序排列,
Python代码  


  • input.sort(lambda x,y : -cmp(x['name'], y['name']))  

 
如果你还有什么关于排序的问题需要解决,欢迎留言!

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-367645-1-1.html 上篇帖子: python 读写XML 下篇帖子: python版本问题导致Boost.Python无法正常使用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表