Python数组排序详解:sort、sorted与argsort的区别及用法

顾言
顾言
发布时间:2026-10-16 | 3人浏览过
原创

本文深入解析Python中三种核心排序机制:list的sort方法、内置sorted函数以及numpy的argsort。详细对比了原地修改与返回新对象的差异,并演示了升序、降序、多维数组及复杂对象排序的具体代码实现,帮助开发者根据场景选择最优方案。

引言

掌握这三种排序工具足以应对日常开发中的大部分需求。

首先明确它们各自的应用场景与核心区别。

  • sort和sorted是Python内置list数据类型的排序方法。
  • argsort则是numpy库中专门用于获取数组排序索引的方法(注:numpy中同样存在sort方法,后续章节将展开说明)。

接下来重点分析sort与sorted的具体差异。

通过以下简单的升序排序示例,分别展示sorted与sort的使用方式。

# sorted 
num_list = [1, 8, 2, 3, 10, 4, 5]
ordered_list = sorted(num_list)
print(ordered_list)    # [1, 2, 3, 4, 5, 8, 10]
# sort
num_list = [1, 8, 2, 3, 10, 4, 5]
num_list.sort()
print(num_list)    # [1, 2, 3, 4, 5, 8, 10]

对比可见,sorted不会改变原始列表,而是返回一个新的已排序列表;sort则直接在原列表上进行修改。核心区别在于:使用sorted需要接收返回值,而sort无需额外变量存储结果。

推荐优先使用sorted。尽管sort代码更简短,但它会直接修改原数组,导致数据源发生变化。若程序中多处引用同一数组,经过sort操作后,原数据已不可恢复,这会增加调试难度。

明确区别后,下面详细列举各类排序场景的具体用法。

用法实例

1.升序排序

# sorted 升序排序
num_list = [1, 8, 2, 3, 10, 4, 5]
ordered_list = sorted(num_list)
print(ordered_list)    # [1, 2, 3, 4, 5, 8, 10]
# sort 升序排序
num_list = [1, 8, 2, 3, 10, 4, 5]
num_list.sort()
print(num_list)    # [1, 2, 3, 4, 5, 8, 10]

2.降序排序

# sorted 降序排序
num_list = [1, 8, 2, 3, 10, 4, 5]
ordered_list = sorted(num_list, reverse=True)
print(ordered_list)    # [1, 2, 3, 4, 5, 8, 10]
# sort 降序排序
num_list = [1, 8, 2, 3, 10, 4, 5]
num_list.sort(reverse=True)
print(num_list)    # [1, 2, 3, 4, 5, 8, 10]

3.若需获取排序后的索引而非值,可采用以下方法

num_list = [1, 8, 2, 3, 10, 4, 5]
ordered_list = sorted(range(len(num_list)), key=lambda k: num_list[k])
print(ordered_list)    # [0, 2, 3, 5, 6, 1, 4]

4.字符串类型排序

# 字符串类型排序
str_list = ['1', '8', '2', '3', '10', '4', '5']
ordered_list = sorted(str_list)
print(ordered_list)  # ['1', '10', '2', '3', '4', '5', '8']

str_list = ['A', 'D', 'B', 'N', 'C', 'R', 'V']
ordered_list = sorted(str_list)
print(ordered_list)  # ['A', 'B', 'C', 'D', 'N', 'R', 'V']

5.二维数组排序

book_list = [
    ['北大马克思主义研究', '9787509728529', 2011],
    ['人的解放', '9787215064003', 2014],
    ['西方经典悦读 资本论', '9787200092882', 2012],
    ['列宁的一生', '9787501319343', 2013],
]

# sorted 按出版年升序排序
ordered_list = sorted(book_list, key=lambda book: book[2])
print(ordered_list)    # [['北大马克思主义研究', '9787509728529', 2011], ['西方经典悦读 资本论', '9787200092882', 2012], ['列宁的一生', '9787501319343', 2013], ['人的解放', '9787215064003', 2014]]

# sort 按出版年降序排序
book_list.sort(key=lambda book: book[2], reverse=True)
print(book_list)    # [['人的解放', '9787215064003', 2014], ['列宁的一生', '9787501319343', 2013], ['西方经典悦读 资本论', '9787200092882', 2012], ['北大马克思主义研究', '9787509728529', 2011]]

6.二维数组获取排序后的索引

# sorted 获取排序后的索引
book_list = [
    ['北大马克思主义研究', '9787509728529', 2011],
    ['人的解放', '9787215064003', 2014],
    ['西方经典悦读 资本论', '9787200092882', 2012],
    ['列宁的一生', '9787501319343', 2013],
]
ordered_list = sorted(range(len(book_list)), key=lambda k: book_list[k][2])
print(ordered_list)  # [0, 2, 3, 1]

7.字典数组排序

book_list = [
    {'name': '北大马克思主义研究', 'isbn': '9787509728529', 'publish_year': 2011},
    {'name': '人的解放', 'isbn': '9787215064003', 'publish_year': 2014},
    {'name': '西方经典悦读 资本论', 'isbn': '9787200092882', 'publish_year': 2012},
    {'name': '列宁的一生', 'isbn': '9787501319343', 'publish_year': 2013},
]
# sorted 按出版年降序排序
ordered_list = sorted(book_list, key=lambda book: book['publish_year'], reverse=True)
print(ordered_list)    # [{'name': '人的解放', 'isbn': '9787215064003', 'publish_year': 2014}, {'name': '列宁的一生', 'isbn': '9787501319343', 'publish_year': 2013}, {'name': '西方经典悦读 资本论', 'isbn': '9787200092882', 'publish_year': 2012}, {'name': '北大马克思主义研究', 'isbn': '9787509728529', 'publish_year': 2011}]
# sort 按出版年升序排序
book_list.sort(key=lambda book: book['publish_year'])
print(book_list)    # [{'name': '北大马克思主义研究', 'isbn': '9787509728529', 'publish_year': 2011}, {'name': '西方经典悦读 资本论', 'isbn': '9787200092882', 'publish_year': 2012}, {'name': '列宁的一生', 'isbn': '9787501319343', 'publish_year': 2013}, {'name': '人的解放', 'isbn': '9787215064003', 'publish_year': 2014}]

8.字典数组获取排序后的索引

book_list = [
    {'name': '北大马克思主义研究', 'isbn': '9787509728529', 'publish_year': 2011},
    {'name': '人的解放', 'isbn': '9787215064003', 'publish_year': 2014},
    {'name': '西方经典悦读 资本论', 'isbn': '9787200092882', 'publish_year': 2012},
    {'name': '列宁的一生', 'isbn': '9787501319343', 'publish_year': 2013},
]
ordered_list = sorted(range(len(book_list)), key=lambda k: book_list[k]['publish_year'])
print(ordered_list)  # [0, 2, 3, 1]

9.对象排序

class Book(object):
    def __init__(self, name, isbn, publish_year):
        self.name = name
        self.isbn = isbn
        self.publish_year = publish_year
    def __repr__(self):
        return repr((self.name, self.isbn, self.publish_year))
book_list = [
    Book('北大马克思主义研究', '9787509728529', 2011),
    Book('人的解放', '9787215064003', 2014),
    Book('西方经典悦读 资本论', '9787200092882', 2012),
    Book('列宁的一生', '9787501319343', 2013),
]
# sorted 按出版年降序排序
ordered_list = sorted(book_list, key=lambda book: book.publish_year, reverse=True)
print(ordered_list)  # [('人的解放', '9787215064003', 2014), ('列宁的一生', '9787501319343', 2013), ('西方经典悦读 资本论', '9787200092882', 2012), ('北大马克思主义研究', '9787509728529', 2011)]
# sort 按出版年升序排序
book_list.sort(key=lambda book: book.publish_year)
print(book_list)  # [('北大马克思主义研究', '9787509728529', 2011), ('西方经典悦读 资本论', '9787200092882', 2012), ('列宁的一生', '9787501319343', 2013), ('人的解放', '9787215064003', 2014)]

10.对象排序获取排序后的索引

book_list = [
    Book('北大马克思主义研究', '9787509728529', 2011),
    Book('人的解放', '9787215064003', 2014),
    Book('西方经典悦读 资本论', '9787200092882', 2012),
    Book('列宁的一生', '9787501319343', 2013),
]
ordered_list = sorted(range(len(book_list)), key=lambda k: book_list[k].publish_year)
print(ordered_list)  # [0, 2, 3, 1]

11.一维数组排序【numpy】

注意:numpy仅提供了sort方法,未提供类似list的sorted函数,但numpy的sort使用方式与list的sorted类似。

import numpy as np

# 一维数组
num_list = np.array([1, 8, 2, 3, 10, 4, 5])
index_list = np.sort(num_list)
print(index_list)    # [ 1  2  3  4  5  8 10]

12.一维数组获取排序后的索引【numpy】

num_list = np.array([1, 8, 2, 3, 10, 4, 5])
index_list = np.argsort(num_list)
print(index_list)    # [0 2 3 5 6 1 4]

13.一维数组降序排序【numpy】

# # 降序排序
num_list = np.array([1, 8, 2, 3, 10, 4, 5])
index_list = np.argsort(-num_list)    # 加负号按降序排序
print(index_list)  # [4 1 6 5 3 2 0]

14.二维数组排序【numpy】

num_list = np.array([
    [1, 8, 2, 9],
    [8, 2, 4, 5],
    [2, 3, 7, 4],
    [1, 2, 3, 5]
])
ordered_list = np.sort(num_list, axis=0)    # axis=0 是按列排序
print(ordered_list)
# [[1 2 2 4]
#  [1 2 3 5]
#  [2 3 4 5]
#  [8 8 7 9]]

ordered_list = np.sort(num_list, axis=1)     # axis=1 是按行排序
print(ordered_list)
# [[1 2 8 9]
#  [2 4 5 8]
#  [2 3 4 7]
#  [1 2 3 5]]

15.二维数组获取排序后的索引【numpy】

num_list = np.array([
    [1, 8, 2, 9],
    [8, 2, 4, 5],
    [2, 3, 7, 4],
    [1, 2, 3, 5]
])
ordered_list = np.argsort(num_list, axis=0)   # axis=0 是按列排序
print(ordered_list)
# [[0 1 0 2]
#  [3 3 3 1]
#  [2 2 1 3]
#  [1 0 2 0]]
ordered_list = np.argsort(num_list, axis=1)  # axis=1 是按行排序
print(ordered_list)
# [[0 2 1 3]
#  [1 2 3 0]
#  [0 1 3 2]
#  [0 1 2 3]]

附:python对数组进行排序,并输出排序后对应的索引值

# -*- coding: cp936 -*-
import numpy as np

#一维数组排序
arr = [1, 3, 5, 2, 4, 6]
arr =  np.array(arr)
print arr
print np.sort(arr)#或print np.sort(arr,axis=None)

print (np.argsort(arr)) # 正序输出索引,从小到大
print (np.argsort(-arr)) # 逆序输出索引,从大到小

输出结果:

[[1 3 5 2 4 6] [1 2 3 4 5 6] [0 3 1 4 2 5] [5 2 4 1 3 0]]

#二维数组排序
list1 = [[4,3,2],[2,1,4]]
array=np.array(list1) 
print array
array.sort(axis=1) #axis=1按行排序,axis=0按列排序
print array

输出结果:

[[4 3 2] [2 1 4]]

[[2 3 4] [1 2 4]]

总结

本文详细介绍了Python中sort、sorted及numpy的argsort排序方法。如需了解更多Python数组处理技巧,可查阅本站往期文章或关注后续更新。感谢支持!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表