sort排序

1.字符串列表排序

列表的排序是python内置功能,自身含有sort方法 。若是元素是字符串,会分解成字符比较,而字符的大小是根据字符对应ascii码的大小。javascript

Python代码    收藏代码
  1. >>> str_list = ['spring''summer''autumn''winter']  
  2. >>> str_list.sort()  
  3. >>> print str_list  
  4. ['autumn''spring''summer''winter']  

 

Python代码    收藏代码
  1. >>> str_list = ['aB''Ab''AB''ab']  
  2. >>> str_list.sort()  
  3. >>> print str_list  
  4. ['AB''Ab''aB''ab']  

 

Python代码    收藏代码
  1. >>> str_list = ['a123''B123''c123']  
  2. >>> str_list.sort()  
  3. >>> print str_list  
  4. ['B123''a123''c123']  

 若是忽略大小字母,让上面结果显示为:['a123', 'B123', 'c123']。怎么作了?java

 

很容易想到DSU用法,decorate-sort-undecorate封装-排序-解封,既简单又快速:python

Python代码    收藏代码
  1. >>> str_list = ['c123''a123''B123']  
  2. >>> temp_list = [(x.lower(), x) for x in str_list]  #decorate  
  3. >>> temp_list.sort()  #sort  
  4. >>> str_list = [x[1for x in temp_list]  #undecorate  
  5. >>> print str_list  
  6. ['a123''B123''c123']  

这是一种重要的编程思想,你如今所处的情景,你想要的结果,你要作的就是搭一座桥梁,让二者之间能够联通!这是的桥梁就是temp_list。spring

 

若是你肯定列表中的元素都是字符串,并且你使用的是Python2.4以上版本,那么使用sorted方法来得更简单:编程

Python代码    收藏代码
  1. >>> str_list = ['c123''a123''B123']  
  2. >>> sorted(str_list, key=str.lower)  
  3. >>> str_list = sorted(str_list, key=str.lower)  
  4. ['a123''B123''c123']  

 这里我提示一点sorted方法并无直接做用于目标列表,而是返回一个排序后的列表。若是你知道排序的是unicode对象列表,可使用key=unicode.lower,或者key = lamdba s: s.lower()app

 

这里给你补充点知识:函数

        python有三种字符串类型:str、unicode、basestring。basestring是抽象类,不能实例化,str和unicode是basestring的子类。普通字符串str怎么转换为Unicode字符串?'Hello'+u' '+'World'   这样就好了,链接中有一个是unicode字符串,结果都为unicode字符串。若是你想知道得更详细,我会写另外一篇文章。学习

        lamdba是匿名函数,python中很是有用的一个函数,掌握它对你受益不浅。spa

 

这里你会不由赞叹python的强大,简单并且优美。程序就是一件艺术品,python无疑是一把优质的雕琢刀,而你的地位刚好是雕塑家。成功与否,不是取决于雕琢刀的好坏,而是你雕刻的方法,这正是咱们应该学习的!.net

 

也许上面两种方法你都没有想到,你想到的是:难道不能从新构造比较方法cmp()吗?

Python代码    收藏代码
  1. >>> def mycmp(a, b):  
  2.     return cmp(a.lower(), b.lower())  
  3.   
  4. >>> str_list = ['c123''a123''B123']  
  5. >>> str_list.sort(mycmp)  
  6. >>> print str_list  
  7. ['a123''B123''c123']  

 不知你发现没有,每两个元素进行比较都会执行两次lower()方法,若是列表中元素为n,那要执行多少次lower()?虽然不推荐这样作,但也给咱们提供了一种思路,若是不是字符串列表,而是结构很复杂的数据列表,咱们就能够采用这样方法!

2.数字列表排序

Python代码    收藏代码
  1. >>> num_list = [124311239]  
  2. >>> num_list.sort()  
  3. >>> print num_list  
  4. [911122343]  

 小数也一样适用

Python代码    收藏代码
  1. >>> num_list = [1243.411.523.09.1]  
  2. >>> num_list.sort()  
  3. >>> print num_list  
  4. [9.111.51223.043.4]  

 我用的是Python2.7,若是你使用是其余版本,可能会出现不一样的结果,如:9.1变成9.100000000001 。这涉及到python中小数是怎么存储的,这里就很少说了!

 

3.字典数据排序

学Java的人都知道Map,而字典就是Python中的“Map”,键值对映射。字典中元素的存储是无序的,怎么对字典数据进行排序?

Python代码    收藏代码
  1. >>> mydict = {"A01":"first""A14":"second""Aa1":"third"}  
  2. >>> print mydict  
  3. {'A14''second''A01''first''Aa1''third'}  
  4. >>> items = mydict.items()  
  5. >>> print items  
  6. [('A14''second'), ('A01''first'), ('Aa1''third')]  
  7. >>> items.sort()  
  8. >>> print items  
  9. [('A01''first'), ('A14''second'), ('Aa1''third')]  
  10. >>> new_list = [value for key, value in items]  
  11. >>> print new_list  
  12. ['first''second''third']  

 前3行说明字典中元素存储是无序的,你构造的字典和实际存储的字典 里元素的顺序并不同!字典的items()方法可以把字典转换为元组的列表,再对元组列表进行排序,获得本身想要的结果。

 

另外一种思路:获得字典key列表,排序后,依次取出value,构形成列表就是你的结果。

Python代码    收藏代码
  1. >>> mydict = {"A01":"first""A14":"second""Aa1":"third"}  
  2. >>> keys = mydict.keys()  
  3. >>> keys.sort()  
  4. >>> new_list = [mydict[key] for key in keys]  
  5. >>> print new_list  
  6. ['first''second''third']  

 经过映射的方法更有效的执行最后一步

Python代码    收藏代码
  1. >>> mydict = {"A01":"first""A14":"second""Aa1":"third"}  
  2. >>> keys = mydict.keys()  
  3. >>> keys.sort()  
  4. >>> new_list = map( mydict.get,keys )  
  5. >>> print new_list  
  6. ['first''second''third']  

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

Python代码    收藏代码
  1. >>> sorted(mydict.items(), key=lambda d:d[0])  
  2. [('A01''first'), ('A14''second'), ('Aa1''third')]  
  3. >>> mydict = {"A01":"first""A14":"second""Aa1":"third"}  
  4. >>> sorted(mydict.items(), key=lambda d:d[0])  
  5. [('A01''first'), ('A14''second'), ('Aa1''third')]  
  6. >>> sorted(mydict.items(), key=lambda d:d[1])  
  7. [('A01''first'), ('A14''second'), ('Aa1''third')]  
  8. >>> print mydict  
  9. {'A14''second''A01''first''Aa1''third'}  

 

4.对象排序

 

Python代码    收藏代码
  1. >>> class Sortobj:  
  2.     a = 0  
  3.     b = ''  
  4.     def __init__(self, a, b):  
  5.         self.a = a  
  6.         self.b = b  
  7.     def printab(self):  
  8.         print self.a, self.b  
  9.   
  10.           
  11. >>> obja = Sortobj(343'keen')  
  12. >>> objb = Sortobj(56'blue')  
  13. >>> objc = Sortobj(2'aba')  
  14. >>> objd = Sortobj(89'iiii')  
  15. >>> obj_list = [obja, objb, objc, objd]  
  16. >>> for obj in obj_list:  
  17.     obj.printab()  
  18.   
  19.       
  20. 343 keen  
  21. 56 blue  
  22. 2 aba  
  23. 89 iiii  
  24. >>> obj_list.sort(lambda x,y: cmp(x.a, y.a)) #按对象的a属性进行排序  
  25. >>> for obj in obj_list:  
  26.     obj.printab()  
  27.   
  28.       
  29. 2 aba  
  30. 56 blue  
  31. 89 iiii  
  32. 343 keen  
  33. >>> obj_list.sort(lambda x,y: cmp(x.b, y.b)) #按对象的b属性进行排序  
  34. >>> for obj in obj_list:  
  35.     obj.printab()  
  36.   
  37.       
  38. 2 aba  
  39. 56 blue  
  40. 89 iiii  
  41. 343 keen  

 

5.字典列表排序

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

Python代码    收藏代码
  1. input = [{'name''Homer''age'39}, {'name''Bart''age':10},{'name''Wang''age':10},{'name''Ab''age':10}]  
  2. print input  
  3. input.sort(lambda x,y : cmp(x['name'], y['name']))   
  4. print input  
 

若是想降序排列,

Python代码    收藏代码
  1. input.sort(lambda x,y : -cmp(x['name'], y['name'])) 
相关文章
相关标签/搜索