list可以通過list的內置函數list.sort()或序列類型函數sorted(list)來進行排序。
兩者的區別是:
- list.sort()不會返回對象,改變原有的list順序。
- sorted(list)返回一個對象,可以用作表達式,原生的list順序不變,生成一個新的排好序的list對象。
排序規則如果不寫的話,就使用默認規則。否則就自定義排序規則。
排序規則可以通過cmp和key參數來指定:
- cmp是自定義比較函數,可以定義排序規則。
- key 是一個函數,它接受一個參數並返回一個用於排序的鍵。這種技巧速度很快,因爲對於每個輸入記錄只會調用一次 key 函數。
在python3.x中,cmp 參數被完全刪除(作爲簡化和統一語言努力的一部分,消除了豐富的比較與 cmp() 魔術方法之間的衝突)
通過cmp參數排序:
def compare(sf1, sf2):
if sf1['value'] < sf2['value']:
return -1
elif sf1['value'] == sf2['value']:
return 0
else:
return 1
listA = [
{'value': 1, 'status': 1},
{'value': 0, 'status': 2},
{'value': 3, 'status': 0},
]
listA.sort(compare)
print listA
結果是:
[{'status': 2, 'value': 0}, {'status': 1, 'value': 1}, {'status': 0, 'value': 3}]
其實這個跟java裏面的排序寫法差不多。
通過key參數排序:
listA = [
{'value': 1, 'status': 1},
{'value': 0, 'status': 2},
{'value': 3, 'status': 0},
]
listA.sort(key=lambda x: x['value']) # x爲list的元素,x['value']爲用於排序的鍵。
print listA
再看一個實際例子
data = [
{'sid': 231L, 'updated': '2013-07-11', 'price': 1.0, 'vip_status': 0},
{'sid': 41544L, 'updated': '2013-09-24', 'price': 40.0, 'vip_status': 0},
{'sid': 43644L, 'updated': '2014-03-11', 'price': 10.0, 'vip_status': 0},
{'sid': 49293L, 'updated': '2014-06-16', 'price': 12.0, 'vip_status': 0}
]
rule = {49293: 0, 231: 1, 41544: 2, 43644: 3}
#data = sorted(data, key=lambda x: rule[x['sid']] if "sid" in x else 0)
data.sort(key=lambda x: rule[x['sid']] if "sid" in x else 0)
print data
最終得到結果如下:
[{'vip_status': 0, 'updated': '2014-06-16', 'price': 12.0, 'sid': 49293L},
{'vip_status': 0, 'updated': '2013-07-11', 'price': 1.0, 'sid': 231L},
{'vip_status': 0, 'updated': '2013-09-24', 'price': 40.0, 'sid': 41544L},
{'vip_status': 0, 'updated': '2014-03-11', 'price': 10.0, 'sid': 43644L}]
請注意,這裏巧妙地多用了一層映射,如果直接簡單的將x[‘sid’]作爲排序的鍵,那自然是按照x[‘sid’]從小到大排序。而爲了按照指定的規則排,可以將x[‘sid’]作爲另一個字典的鍵,映射成另一個值,這樣排序的鍵就變成了0,1,2,3。第一個 元素進來,其排序值爲1,第二個元素其排序值爲2,第三個排序值爲3,第四個排序值爲0。於是按照排序值從小到大得到最終結果。