1. 程式人生 > 程式設計 >python3 sorted 如何實現自定義排序標準

python3 sorted 如何實現自定義排序標準

在 python2 中,如果想要自定義評價標準的話,可以這麼做

def cmp(a,b):
 # 如果邏輯上認為 a < b ,返回 -1
 # 如果邏輯上認為 a > b,返回 1
 # 如果邏輯上認為 a == b,返回 0 
 pass

a = [2,3,1,2]
a = sorted(a,cmp)

但是在 python3 中,cmp 這個引數已經被移除了,那麼在 python3 中應該怎麼實現 python2 的 cmp 功能呢?

import functools
def cmp(a,b):
  if b < a:
    return -1
  if a < b:
    return 1
  return 0
a = [1,2,5,4]
print(sorted(a,key=functools.cmp_to_key(cmp)))

上面這個方法實現了降序排列,因為 -1 代表我們邏輯上認為 a<b ,而實際上 b<a 。

追溯 cmp_to_key 的原始碼,發現是這樣的

def cmp_to_key(mycmp):
  """Convert a cmp= function into a key= function"""
  class K(object):
    __slots__ = ['obj']
    def __init__(self,obj):
      self.obj = obj
    def __lt__(self,other):
      return mycmp(self.obj,other.obj) < 0
    def __gt__(self,other.obj) > 0
    def __eq__(self,other.obj) == 0
    def __le__(self,other.obj) <= 0
    def __ge__(self,other.obj) >= 0
    __hash__ = None
  return K

返回的是一個類,在 sorted 內部,類接收一個引數構造一個例項,然後例項通過過載的方法來進行比較。

k1 = K(1)
k2 = K(2)

# 問題,k1,k2 誰是 self,誰是 other
# k1 是 self, k2 是 other
print(k1 < k2)

補充知識:Python sorted--key引數用法

sorted(iterable[,key][,reverse])

從 iterable 中的專案返回新的排序列表。

有兩個可選引數,必須指定為關鍵字引數。

key 指定一個引數的函式,用於從每個列表元素中提取比較鍵:key=str.lower。預設值為 None (直接比較元素)。

reverse 是一個布林值。如果設定為 True,那麼列表元素將按照每個比較反轉進行排序。

示例:建立由元組構成的列表:a = [('b',3),('a',2),('d',4),('c',1)]

按照第一個元素排序

sorted(a,key=lambda x:x[0])

>>> [('a',('b',1),4)]

按照第二個元素排序

sorted(a,key=lambda x:x[1])

>>> [('c',4)]

key = lambda x:x[?] 是固定寫法,x其實可以為任意值。

以上這篇python3 sorted 如何實現自定義排序標準就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。