python中list的排序

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。於是按照排序值從小到大得到最終結果。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章