在 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
defcmp
(a, b):
if b < a:
return -1
if a < b:
return
1return
0a = [1, 2, 5, 4]
print(sorted(a, key=functools.cmp_to_key(cmp)))
上面這個方法實現了降序排列,因為-1
代表我們邏輯上認為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):
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
返回的是乙個類,在sorted
內部,類接收乙個引數構造乙個例項,然後例項通過過載的方法來進行比較。
k1 = k(1)
k2 = k(2)
# 問題,k1,k2 誰是 self,誰是 other
# k1 是 self, k2 是 other
print(k1 < k2)
Python3內建函式sorted
排序也是在程式中經常用到的演算法。無論使用氣泡排序還是快速排序,排序的核心是比較兩個元素的大小。如果是數字,我們可以直接比較,但如果是字串或者兩個dict呢?直接比較數學上的大小是沒有意義的,因此,比較的過程必須通過函式抽象出來。python內建的sorted 函式就可以對list進行排序 sort...
Python3內建函式sorted
排序也是在程式中經常用到的演算法。無論使用氣泡排序還是快速排序,排序的核心是比較兩個元素的大小。如果是數字,我們可以直接比較,但如果是字串或者兩個dict呢?直接比較數學上的大小是沒有意義的,因此,比較的過程必須通過函式抽象出來。python內建的sorted 函式就可以對list進行排序 sort...
Python3 中sorted 函式的用法
描述 sorted 函式對所有可迭代的物件進行排序操www.cppcns.com作。語法sorted iterable,key none,reverse false iterable 可迭代物件。key 主要是用來進行比較的元素,只有乙個引數,具體的函式的引數就是取自於可迭代物件中,指定可迭代物件中...