python 3.0 中的 排序 sort() 和 sorted() cmp 向 key 的转换 多级排序

一:声明

          python 3.0 中 取消了 cmp 函数

二:sort 和 sorted 的用法

    (1) 基本用法

           l = [2,1,3,5,4]

          sort 函数改变列表l本身

          sorted函数不改变原列表,返回一个新列表    

          l.sort()  默认升序

          k = sorted(l)    默认升序

   (2)加深一点

         sorted(iterable,key,reverse)

         sort(key,reverse)

         下面以sorted 为例讲起

         iterable 为 要排序的 对象(如:列表)

         key参数来指定一个函数,此函数在每个元素比较前被调用。  默认会按照指定的key值进行排序,可为空

         reverse  排序规则,reverse = True 降序, reverse = False 升序   可为空 默认升序

        (1)  对于复杂的对象,使用对象的下标作为key。

      

nums = [[1,'chen'], [2,'hui'], [1,'hui'], [2,'chen']]
_nums2 = sorted(nums, key = lambda x: x[0],reverse = True)
print(_nums2)

        (2) 若当有多级排序时,但多级排序的形式是一样的,若是升序都是升序,若是降序都是降序

        可以引进  operator模块 中 itemgetter attrgetter 函数 :from operator import itemgetter, attrgette

  • operator.itemgetter()   ----- 通过下标
  • operator.attrgetter()   ----- 通过参数
  • operator.methodcaller() -----python 2.5 被引入,下文详细介绍 

   如代码:

from operator import itemgetter, attrgetter
nums = [[1,'chen'], [2,'hui'], [1,'hui'], [2,'chen']]
_nums1 = sorted(nums, key = itemgetter(0,1),reverse = True)
_nums2 = sorted(nums, key = lambda x: (x[0], x[1]),reverse = True)
print(_nums1)
print(_nums2)

结果:

结果时一样的

下面介绍operator.methodcaller() 函数:

这个函数是对某个对象的使用固定参数进行排序,例如:str.count() 函数可以计算每个字符串对象中含有某个参数的个数,那运用这个函数我就可以通过 str.count() 计算出某个字符的个数从而来确定排序的优先级:

>>> from operator import methodcaller
>>> messages = ['critical!!!', 'hurry!', 'standby', 'immediate!!']
>>> sorted(messages, key=methodcaller('count', '!'))
['standby', 'hurry!', 'immediate!!', 'critical!!!']

(3)多级参数且排序形式不一样

  可以借助 functools模块中 cmp_to_key() 函数,模拟cmp函数

  如按照 下表0的降序 和下表1的升序排序

""""如果 x 应该排在 y 的前面,返回 -1,如果 x 应该排在 y 的后面,返回 1。如果 x 和 y 相等,返回 0。"""

  代码:

import functools
nums = [[1,'chen'], [2,'hui'], [1,'hui'], [2,'chen']]
def tcmp(a, b):
    if a[0] > b[0]:
        return -1
    elif a[0] == b[0]:
        if a[1] < b[1]:
            return -1
        elif a[1] > b[1]:
            return 1
        else :
            return 0
    elif a < b:
        return 1
_nums = sorted(nums, key=functools.cmp_to_key(tcmp))
print(_nums)

结果:

上述多级排序,在参数相同的情况下,好像都不改变相对位置

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值