http://www.cnblogs.com/BeginMan/p/3193081.html一、Python的排序1、reversed()這個很好理解,reversed英文意思就是:adj. 顛倒的;相反的;(判決等)撤銷的print list(reversed(['dream','a','have...
http://www.cnblogs.com/BeginMan/p/3193081.html
一、Python的排序
1、reversed()
這個很好理解,reversed英文意思就是:adj. 顛倒的;相反的;(判決等)撤銷的
print list(reversed(['dream','a','have','I']))
#['I', 'have', 'a', 'dream']
2、讓人糊塗的sort()與sorted()
在Python 中sorted是內建函數(BIF),而sort()是列表類型的內建函數list.sort()。
sorted()
- sorted(iterable[, cmp[, key[, reverse]]])
-
Return a new sorted list from the items in iterable.
The optional arguments(可選參數) cmp, key, and reverse have the same meaning as those for the list.sort() method (described in section Mutable Sequence Types).
cmp specifies(指定) a custom comparison function of two arguments (iterable(可迭代的) elements) which should return a negative(複數), zero or positive(正數) number depending on whether the first argument is considered smaller than, equal to, or larger than the second argument: cmp=lambda x,y: cmp(x.lower(), y.lower()). The default value is None.
key specifies a function of one argument that is used to extract a comparison key from each list element: key=str.lower. The default value is None (compare the elements directly).
reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed.
#字元串排序使用是字典序,而非字母序
"""sorted()按照字典序排序"""
lis = ['a','c','z','E','T','C','b','A','Good','Tack']
print sorted(lis) #['A', 'C', 'E', 'Good', 'T', 'Tack', 'a', 'b', 'c', 'z']
關於字典序:
可參考百度百科。http://baike.baidu.com/view/4670107.htm
根據ASCII排,具體如下:------------
0-9(對應數值48-59);
A-Z(對應數值65-90);
a-z(對應數值97-122);標準序: 短在前,長在後,等長的依次比字母,
如to < up < cap < cat < too < two <boat < boot < card
字典序: 依次比字母,
如boat < boot <cap < card < cat < to < too< two < up更有甚者說字典序就是字典的排序,像字典一樣。我一直沒有找到權威的說明,什麼是字典序????求答案!!
sort()
s.sort([cmp[, key[, reverse]]])
三、Python的字典排序
1、關於Python字典的一些特征
無序:
字典,形如 dic = {'a':1 , 'b':2 , 'c': 3},字典中的元素沒有順序,所以dic[0]是有語法錯誤的。
無重:
不可以有重覆的鍵值,所以 dic.add['c'] = 4後,字典變成 {'a':1 , 'b':2 , 'c': 4}.
2、根據“鍵”或“鍵值”進行不同順序的排序
函數原型:sorted(dic,value,reverse)
解釋:dic為比較函數,value 為排序的對象(這裡指鍵或鍵值),
reverse:註明升序還是降序,True--降序,False--升序(預設)
3、例子:
dic = {'a':31, 'bc':5, 'c':3, 'asd':4, '33':56, 'd':0}
想把dic的value按照從大到小排序(value都是整數)。
dic = {'a':31, 'bc':5, 'c':3, 'asd':4, '33':56, 'd':0}
print sorted(dic.iteritems(), key=lambda d:d[1], reverse = False )
#[('d', 0), ('c', 3), ('asd', 4), ('bc', 5), ('a', 31), ('33', 56)]
解釋如下:
(1)、dic.iteritems(),返回字典鍵值對的元祖集合
print dic.iteritems() #<dictionary-itemiterator object at 0x00B71A80>
for obj in dic.iteritems():
print obj,obj[0],obj[1]
#('a', 31) a 31
#('c', 3) c 3
#('d', 0) d 0
#('bc', 5) bc 5
#('33', 56) 33 56
#('asd', 4) asd 4
(2)、關於排序對象
上述已經說過,value(或key)為排序的對象(這裡指鍵或鍵值),然而為什麼使用lambda函數呢,這裡請參閱:點擊閱讀
key=lambda d:d[1] 是將鍵值(value)作為排序對象。
key = lambda d:d[1]
for i in dic.iteritems():
print key(i), #輸出31 3 0 5 56 4,這些都是字典dic的值
如果選擇 key = lambda d:d[0],則選擇【鍵Key】作為排序對象。
(3)、reverse
reverse 是否反向,reverse=Ture表示反向。
(4)、註意:
sorted(dic.iteritems(), key=lambda d:d[1], reverse = False )將每一項dic.iteritems()鍵值對的元祖進行迭代,每一項都作為參數傳入key()函數(我說的是這個:key=lambda d:d[1],)中。
4、回顧
lis = ['a','bc','c','asd','33','d']
print sorted(lis) #['33', 'a', 'asd', 'bc', 'c', 'd']
依次比字母, 如boat < boot <cap < card < cat < to < too< two < up
5.問題
具體實例可參考:[**python的排序函數sort,sorted在列表排序和字典排序中的應用詳解和舉例**](http://wangwei007.blog.51cto.com/68019/1100742)
現在有這種情況,排序中排序。如大題號排序,然後大題對應的小題號也排序,如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
lis = [{ 'Big' : 3 , 'small' : 2 },{ 'Big' : 3 , 'small' : 4 },{ 'Big' : 2 , 'small' : 2 }, { 'Big' : 3 , 'small' : 1 },{ 'Big' : 2 , 'small' : 1 },{ 'Big' : 1 , 'small' : 1 }]
# 大題號排序
li = sorted (lis, key = lambda s: s[ 'Big' ])
# 輸出:
#[{'small': 1, 'Big': 1}, {'small': 2, 'Big': 2}, {'small': 1, 'Big': 2}, {'small': 2, 'Big': 3}, {'s
mall ': 4, ' Big ': 3}, {' small ': 1, ' Big': 3 }]
# 小題號排序:
sort_ff = []
no = set ([i[ 'Big' ] for i in li])
for obj in no:
li_ = []
for i in ff:
if i[ 'Big' ] = = obj:
li_.append(i)
l = sorted (li_, key = lambda s: s[ 'small' ])
for j in l:
sort_ff.append(j)
# 輸出結果:
[{ 'small' : 1 , 'Big' : 1 }, { 'small' : 1 , 'Big' : 2 }, { 'small' : 2 , 'Big' : 2 }, { 'small' : 1 , 'Big' : 3 }, { 'small' : 2 , 'Big' : 3 }, { 'small' : 4 , 'Big' : 3 }]
|
善用sort() 或 sorted(), a.sort() 已改變其結構,b = a.sort() 是錯誤的寫法! 而 sorted(a, ...)並沒有改變a的結構。
======================================
- #-*- encoding=utf-8 -*-
- import operator
- #按字典值排序(預設為升序)
- x = {1:2, 3:4, 4:3, 2:1, 0:0}
- sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1))
- print sorted_x
- #[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]
- #如果要降序排序,可以指定reverse=True
- sorted_x = sorted(x.iteritems(), key=operator.itemgetter(1), reverse=True)
- print sorted_x
- #[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]
- #或者直接使用list的reverse方法將sorted_x順序反轉
- #sorted_x.reverse()
- #取代方法是,用lambda表達式
- sorted_x = sorted(x.iteritems(), key=lambda x : x[1])
- print sorted_x
- #[(0, 0), (2, 1), (1, 2), (4, 3), (3, 4)]
- sorted_x = sorted(x.iteritems(), key=lambda x : x[1], reverse=True)
- print sorted_x
- #[(3, 4), (4, 3), (1, 2), (2, 1), (0, 0)]
- #包含字典dict的列表list的排序方法與dict的排序類似,如下:
- x = [{'name':'Homer', 'age':39}, {'name':'Bart', 'age':10}]
- sorted_x = sorted(x, key=operator.itemgetter('name'))
- print sorted_x
- #[{'age': 10, 'name': 'Bart'}, {'age': 39, 'name': 'Homer'}]
- sorted_x = sorted(x, key=operator.itemgetter('name'), reverse=True)
- print sorted_x
- #[{'age': 39, 'name': 'Homer'}, {'age': 10, 'name': 'Bart'}]
- sorted_x = sorted(x, key=lambda x : x['name'])
- print sorted_x
- #[{'age': 10, 'name': 'Bart'}, {'age': 39, 'name': 'Homer'}]
- sorted_x = sorted(x, key=lambda x : x['name'], reverse=True)
- print sorted_x
- #[{'age': 39, 'name': 'Homer'}, {'age': 10, 'name': 'Bart'}]