1.字符串列表排序
列表的排序是python內置功能,自身含有sort方法 。若是元素是字符串,會分解成字符比較,而字符的大小是根據字符對應ascii碼的大小。javascript
- >>> str_list = ['spring', 'summer', 'autumn', 'winter']
- >>> str_list.sort()
- >>> print str_list
- ['autumn', 'spring', 'summer', 'winter']
- >>> str_list = ['aB', 'Ab', 'AB', 'ab']
- >>> str_list.sort()
- >>> print str_list
- ['AB', 'Ab', 'aB', 'ab']
- >>> str_list = ['a123', 'B123', 'c123']
- >>> str_list.sort()
- >>> print str_list
- ['B123', 'a123', 'c123']
若是忽略大小字母,讓上面結果顯示爲:['a123', 'B123', 'c123']。怎麼作了?java
很容易想到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。spring
若是你肯定列表中的元素都是字符串,並且你使用的是Python2.4以上版本,那麼使用sorted方法來得更簡單:編程
- >>> 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 = 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()嗎?
- >>> 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.數字列表排序
- >>> num_list = [12, 43, 11, 23, 9]
- >>> num_list.sort()
- >>> print num_list
- [9, 11, 12, 23, 43]
小數也一樣適用
- >>> 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」,鍵值對映射。字典中元素的存儲是無序的,怎麼對字典數據進行排序?
- >>> 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,構形成列表就是你的結果。
- >>> 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']
經過映射的方法更有效的執行最後一步
- >>> 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排序
- >>> 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.對象排序
- >>> 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.字典列表排序
元素全是字典的列表,如何排序?其實把上面的方法綜合起來就能實現:
- 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
若是想降序排列,
- input.sort(lambda x,y : -cmp(x['name'], y['name']))