sorted

方法1.用List的成员函数sort进行排序,在本地进行排序,不返回副本
方法2.用built-in函数sorted进行排序(从2.4开始),返回副本,原始输入不变

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

参数说明:

  • iterable -- 可迭代对象。
  • cmp -- 比较的函数,这个具有两个参数,参数的值都是从可迭代对象中取出,此函数必须遵守的规则为,大于则返回1,小于则返回-1,等于则返回0。
  • key -- 主要是用来进行比较的元素,

cmp详解,首先python3不存在cmp,使用functools.cmp_to_key(函数)代替cmp

----cmp函数的意思(用于可迭代对象)

如果希望元素能按照特定的方式进行排序(而不是sort函数默认的方式,即根据python的默认排序规则按升序排列元素),那么可以通过compare(x,y)形式自定义比较函数。
compare(x,y)函数会在x<y时返回负数,在x>y时返回正数,如果x=y则返回0(根据你的定义)。定义好该函数之后,就可以提供给sort方法作为参数了。内建函数cmp提供了比较函数的默认实现方式:

>>> cmp(42,32)

1

>>> cmp(99,100)

-1

>>> cmp(10,10)

0

------那么python中的sorted 如何根据cmp中的 1 -1 0来排序的,为什么返回1或-1就可以判定正序或逆序呢?

cmp比较两个元素的大小,如果返回1,将第一个元素移动至后面,返回0表示相等,返回-1将第二个元素移动至后面(也就是位置不变),据cmp的返回值执行算法,将小的元素放前面,大的元素放后面

>>> def numeric_compare(x, y):
...     return x - y
>>> sorted([5, 2, 4, 1, 3], cmp=numeric_compare) 
[1, 2, 3, 4, 5]

x-y>0,cmp(x-y>0)=1,代表吧第一个元素(x)放后面,这就是从小到大排序

>>> def reverse_numeric(x, y):
...     return y - x
>>> sorted([5, 2, 4, 1, 3], cmp=reverse_numeric) 
[5, 4, 3, 2, 1]

cmp(y-x>0)=1,就把第一个元素(x)放后面【也就是越小越在后面】,也就是从大到小排序

-----再后来python3没有了cmp参数,使用functools.cmp_to_key(函数)代替cmp

看一个复杂的例子

def cmp(e1, e2):
    import numpy as np
    res = np.sign(e1[1] - e2[1])
    if res != 0:
        return res
    else:
        a = e1[0] + e2[0]
        b = e2[0] + e1[0]
        if a > b:
            return 1
        elif a == b:
            return 0
        else:
            return -1

for k,v in sorted(tfidf_dic.items(), key = functools.cmp_to_key(cmp))

我们手工定义了cmp函数(只返回-1,0,1)

首先比较字典中两个元素,各自的第二项(value),因为是第一个大于第二个返回1,functools.cmp_to_key(cmp)把第一个元素放在后面,代表从小到大排序

之后比较字典两个元素,各自的第一项(key),因为第一个ascii码大于第二个返回1,从而也是代表从小到大排序

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值