functiontools模組,pythonfunctiontools
#!/usr/bin/env python
# -*- coding:utf-8 -*-
from functools import cmp_to_key
a = [1, 6, 4, 5]
a.sort(key=cmp_to_key(lambda x, y: x - y))
# cmp_to_key(lambda x,y:x-y)是一個k類
# 當x=4,y=3的時候,k類被執行個體化,mycamp是lambda x,y:x-y return x-y
# 首先當進行sort比較的時候,列表裡面的元素被執行個體化傳進去
# self.obj = 4 other.obj = 3
# sort函數預設是從小到大排列,在比較的過程中,由於4比3大,自動觸發__gt__這個函數,
# mycmp的傳回值是4 -3 = 1,再和0做比較,1 > 0,所以cmp_to_key(mycmp)的傳回值為True
# 所以正序排列
# 如果mycamp是lambda x,y:x-y return y-x
# self.obj = 4 other.obj = 3
# sort函數預設是從小到大排列,在比較的過程中,由於4比3大,自動觸發__gt__這個函數,
# mycmp的傳回值是3 - 4 = -1,再和0做比較,-1 < 0,所以cmp_to_key(mycmp)的傳回值為False
# 所以反序排列
def cmp_to_key(mycmp):
"""Convert a cmp= function into a key= function"""
class K(object):
__slots__ = ['obj']
def __init__(self, obj, *args):
self.obj = obj
def __gt__(self, other):
return mycmp(self.obj, other.obj) > 0
def __gt__(self, y): # real signature unknown; restored from __doc__
""" x.__gt__(y) <==> x>y """
pass
return K