1. 程式人生 > >Python集合多列排序,多規則排序

Python集合多列排序,多規則排序

今天遇到一個多列排序的問題,排序規則正反不等。接下來就讓我們來看看Python的強大之處吧

我遇到的集合是這樣的:

tm_list = [{'markname': '意迪拉凱', 'sm_type': 1, 'sm_zh': 0.4},
           {'markname': '盤珠小資料', 'sm_type': 0, 'sm_zh': 0.3},
           {'markname': '伊人初夏', 'sm_type': 2, 'sm_zh': 0.95},
           {'markname': '燁辰', 'sm_type': 1, 'sm_zh': 0.4},
           {
'markname': '螺哆哆', 'sm_type': 1, 'sm_zh': 0.5}]

這是一組商標資料,初步的要求是按照相似型別:sm_type倒敘,中文相似度:sm_zh倒敘排列,我們可以這樣寫:

sorted(tm_list, key=lambda tm: (tm["sm_type"], tm["sm_zh"]), reverse=True)

我們看一下排序結果:

[{'markname': '伊人初夏', 'sm_type': 2, 'sm_zh': 0.95}, 
{'markname': '螺哆哆', 'sm_type': 1, 'sm_zh': 0.5},
{'markname
': '意迪拉凱', 'sm_type': 1, 'sm_zh': 0.4}, {'markname': '燁辰', 'sm_type': 1, 'sm_zh': 0.4}, {'markname': '盤珠小資料', 'sm_type': 0, 'sm_zh': 0.3}]

結果正確無誤,但是需求你們的懂的,就像是女朋友的臉,風雲變幻。果然,很快變化來了。我們需要根據:sm_type倒敘,sm_zh倒敘,markname長度正序排列,這時候多列排序的規則不再一致,所以reverse就顯得力不從心了。按照名稱長短正序排列的話 “燁辰” 應該在 “意迪拉凱” 前面,

那我們該如何解決這個問題呢,Python中還封裝了另一個好用的方法,就是“-”號排序。Like This:

sorted(tm_list, key=lambda tm: (-tm["sm_type"], -tm["sm_zh"], len(tm["markname"])))

排序中加“-”號的為倒敘,不加“-”號的為正序,我們看一下排序結果:

[{'markname': '伊人初夏', 'sm_type': 2, 'sm_zh': 0.95},
{'markname': '螺哆哆', 'sm_type': 1, 'sm_zh': 0.5},
{'markname': '燁辰', 'sm_type': 1, 'sm_zh': 0.4},
{'markname': '意迪拉凱', 'sm_type': 1, 'sm_zh': 0.4},
{'markname': '盤珠小資料', 'sm_type': 0, 'sm_zh': 0.3}]

完美~