溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

python3中sorted實(shí)現(xiàn)自定義排序標(biāo)準(zhǔn)的示例

發(fā)布時(shí)間:2021-02-01 11:07:53 來(lái)源:億速云 閱讀:231 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)python3中sorted實(shí)現(xiàn)自定義排序標(biāo)準(zhǔn)的示例的內(nèi)容。小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,一起跟隨小編過(guò)來(lái)看看吧。

在 python2 中,如果想要自定義評(píng)價(jià)標(biāo)準(zhǔn)的話,可以這么做

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

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

但是在 python3 中,cmp 這個(gè)參數(shù)已經(jīng)被移除了,那么在 python3 中應(yīng)該怎么實(shí)現(xiàn) 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)))

上面這個(gè)方法實(shí)現(xiàn)了降序排列,因?yàn)?-1 代表我們邏輯上認(rèn)為 a<b ,而實(shí)際上 b<a 。

追溯 cmp_to_key 的源碼,發(fā)現(xiàn)是這樣的

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):
      return mycmp(self.obj, other.obj) > 0
    def __eq__(self, other):
      return mycmp(self.obj, other.obj) == 0
    def __le__(self, other):
      return mycmp(self.obj, other.obj) <= 0
    def __ge__(self, other):
      return mycmp(self.obj, other.obj) >= 0
    __hash__ = None
  return K

返回的是一個(gè)類,在 sorted 內(nèi)部,類接收一個(gè)參數(shù)構(gòu)造一個(gè)實(shí)例,然后實(shí)例通過(guò)重載的方法來(lái)進(jìn)行比較。

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

# 問(wèn)題,k1,k2 誰(shuí)是 self,誰(shuí)是 other
# k1 是 self, k2 是 other
print(k1 < k2)

補(bǔ)充知識(shí):Python sorted--key參數(shù)用法

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

從 iterable 中的項(xiàng)目返回新的排序列表。

有兩個(gè)可選參數(shù),必須指定為關(guān)鍵字參數(shù)。

key 指定一個(gè)參數(shù)的函數(shù),用于從每個(gè)列表元素中提取比較鍵:key=str.lower。默認(rèn)值為 None (直接比較元素)。

reverse 是一個(gè)布爾值。如果設(shè)置為 True,那么列表元素將按照每個(gè)比較反轉(zhuǎn)進(jìn)行排序。

示例:創(chuàng)建由元組構(gòu)成的列表:a = [('b',3), ('a',2), ('d',4), ('c',1)]

按照第一個(gè)元素排序

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

>>> [('a',2),('b',3),('c',1),('d',4)]

按照第二個(gè)元素排序

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

>>> [('c',1),('a',2),('b',3),('d',4)]

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

感謝各位的閱讀!關(guān)于“python3中sorted實(shí)現(xiàn)自定義排序標(biāo)準(zhǔn)的示例”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,讓大家可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),可以把它分享出去讓更多的人看到吧!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI