区别 list.sort , sorted 与Numpy.sort

Tips:以下内容都是基于python3.x, 未考虑cmp参数。

参考链接1:

参考链接2:官方文档:sorted(iterable, *, key=None, reverse=False)

参考链接3:官方文档:numpy.sort — NumPy v1.22.dev0 Manual

这两天开始接触numpy库,在编写一个排序程序时,发现这几个函数很像,常常绕晕。因此专门对比了下这三个函数的异同,总结在这里。

本文先整体介绍了三者的区别,然后对详细解释了三者的参数使用方式。

首先,我们可以看到,三者的标准使用方式分别如下:

list.sort(*, key=None, reverse=False )

sorted(iterable, *, key=None, reverse=False)

numpy.sort(array, axis, kind, order) 

> numpy.sort()与  sorted() , list.sort() 的区别

其中sorted() 和list.sort()是Python内置的排序函数,在python程序中可以直接使用;而 numpy.sort是引入numpy库才可以使用的排序函数。

> sorted() 和list.sort() 的区别

先来分析Python的两种内置排序函数,sorted() 和list.sort():

  1. 参数区别:
    1. list.sort() 方法只是为列表list定义的。
    2. sorted() 函数可以接受任何可迭代对象
  2. 返回值区别:
    1. Python列表内置的 list.sort() 方法可以直接修改列表。
    2. sorted() 内置函数,它会从一个可迭代对象构建一个新的排序列表。

从函数表达式中可以看到除了上述不同之处外,两者的参数使用方法一致,主要是 key, reverse.

reverse 是一个相对简单的参数,是指排序规则,reverse = True 降序, reverse = False 升序(默认)。

key ,order

key是一个自己困扰了很久的参数。整体来说,key 形参用来指定在进行比较前要在每个列表元素上调用的函数。

详细来说,key的值,是一个函数,我们在本文中暂且称它为KVF(key's value function)。我们知道函数是指由 N个自变量组成的一个表达式 ,使用函数可以得到一个返回值。

KVF的返回值 是一个用于排序的键。

KVF与普通函数不同之处在于KVF只接收1个自变量,也称作参数,即KVF只接收1个参数。

这个参数不是任意的。这个参数是当前进行排序的 list 或 任意iterable 中的元素list[i] 或者 iterable[i]。为了便于理解,可以参考下面的示例代码:

sorted("This is a test string from Andrew".split(), key=str.lower)
['a', 'Andrew', 'from', 'is', 'string', 'test', 'This']

示例代码中,str.lower是一个将大写字母变成小写的函数,接收的参数是['This', 'is', 'a', 'test', 'string', 'from', 'Andrew']这个数组的各个元素。使用key之后,此数组将不再区分大小写,按默认的reverse=False排序。

当针对复杂对象进行排序时,常结合lamda函数,使用该对象的一些索引作为键。

sdtype={'names':['name','score','age'],
        'formats':['S32','S32','i'] }
student_tuples = np.array([
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
],dtype=sdtype)
reslut_sorted = sorted(student_tuples, key=lambda student: student[2])   # sort by age
type(reslut_sorted) #list

'''
##输出
[('dave', 'B', 10), ('jane', 'B', 12), ('john', 'A', 15)]
'''

其中 student是自定义的参数名,可以任意设置,其值是student= student_tuples[i],因此student[2]=student_tuples[i][2] ,即'age'。

order

numpy.sort()有4个参数 array, axis, kind, order。

  • a: 要排序的数组
  • axis: 沿着它排序数组的轴,如果没有数组会被展开,沿着最后的轴排序, axis=0 按列排序,axis=1 按行排序
  • kind: 默认为'quicksort'(快速排序),另外3种常见类型 ‘mergesort’ (归并排序), ‘heapsort’(堆排序), ‘stable’(稳定排序)},可以根据数据不同选择不同的排序算法 节约时间
  • order: 如果数组包含字段,则是要排序的字段

其中的order,在概念上与另两个函数中的参数key非常相似 。order是当数组包含字段时(结构化数组使用),使用order来指定使用哪个字段。

order可以直接指定字段,相当于直接取到key的返回值。

上面的代码也可写作:

sdtype={'names':['name','score','age'],
        'formats':['S32','S32','i'] }
student_tuples = np.array([
    ('john', 'A', 15),
    ('jane', 'B', 12),
    ('dave', 'B', 10),
],dtype=sdtype)
reslut_npsort = np.sort(student_tuples,order='age')   # sort by age
type(reslut_npsort) # numpy.ndarray

'''
##输出
array([(b'dave', b'B', 10), (b'jane', b'B', 12), (b'john', b'A', 15)],
      dtype=[('name', 'S32'), ('score', 'S32'), ('age', '<i4')])
'''

另外,两者的返回的数据类型也不同。sorted返回list类型,np.sort返回numpy.ndarray类型。

以上是自己目前对这几个函数的理解。有不对的地方还请大家指正。

END

猜你喜欢

转载自blog.csdn.net/lamanchas/article/details/120459870
今日推荐