Python集合多列排序,多規則排序
阿新 • • 發佈:2018-12-18
今天遇到一個多列排序的問題,排序規則正反不等。接下來就讓我們來看看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}]
完美~