Python自定义排序规则:functools.cmp_to_key()

Python自定义排序规则:functools.cmp_to_key()

使用场景

fuctools.cmp_to_key()是用来自定义排序规则,类似于C++中的lambada函数一样,使得sort()函数可以按照自己定义的比较规则进行排序。

使用规则

  • 以剑指offer45题为例:
def cmp(a, b):
    if a + b > b + a:
        return 1
    elif a + b < b + a:
        return -1
    else:
        return 0

当使用nums.sort(key = functools.cmp_to_key(cmp))调用时,将nums按照从小到大的顺序排列。

  • 由以上例子可知,cmp中定义的规则就相当于是通过key参数告诉函数sort()如何对两个数进行比较,让它清楚什么样的条件是“大”,什么样的条件是“小”。
    注意:定义这个排序规则只是为了让sort()明白如何得到两个数中较“大”的那个与数组最后是“从小到大”排序还是“从大到小”排序没有关系。
  • sort()如何排序是由第二个参数reverse来确定的。
nums.sort(key = functools.cmp_to_key(cmp), reverse = True) # 数组nums按照从“大”到“小”的顺序排列
nums.sort(key = functools.cmp_to_key(cmp), reverse = False) # 数组nums按照从“小”到“大”的顺序排列
nums.sort(key = functools.cmp_to_key(cmp)) # 不写时,默认是按照从“小”到“大”的顺序排列
Python中,我们可以通过自定义排序函数来实现对列表或字典的自定义排序。首先,如果我们想对字典按照值进行排序,可以使用sorted函数和lambda表达式来实现。例如,我们可以按照值的降序排列一个字典s: s = {'a': 45, 'b': 44, 'c': 78, 'd': 34} a = sorted(s.items(), key=lambda x: x, reverse=True) print('按照value降序排序:', a) 同样地,我们也可以按照值的升序排列字典s: a1 = sorted(s.items(), key=lambda x: x, reverse=False) print('按照value升序排序:', a1) 如果我们想对列表按照某个元素进行排序,可以使用sort方法或sorted函数,并通过自定义排序函数来指定排序依据。例如,假设我们要对列表a进行按照元素mode 7后的升序排序,可以定义一个compare_personal函数来实现: import functools a = [3, 8, 14, 6, 7] def compare_personal(x, y): return x % 7 - y % 7 a.sort(key=functools.cmp_to_key(compare_personal)) b = sorted(a, key=functools.cmp_to_key(compare_personal)) print(a) print(b) 这样,我们就可以得到按照元素mode 7后的升序排列的列表a和b: [14, 7, 8, 3, 6]<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [python 自定义排序](https://blog.csdn.net/dpengwang/article/details/85839652)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [一文教你搞定Python如何自定义标准排序](https://blog.csdn.net/weixin_57662182/article/details/127890324)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值