Tips:以下内容都是基于python3.x, 未考虑cmp参数。
参考链接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():
- 参数区别:
- list.sort() 方法只是为列表list定义的。
- sorted() 函数可以接受任何可迭代对象。
- 返回值区别:
- Python列表内置的 list.sort() 方法可以直接修改列表。
- 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