python数组排序方法之sort、sorted和argsort详解

目录

  • 引言
  • sort和sorted的区别如下
  • 用法实例
    • 1.升序排序
    • 2.降序排序
    • 3.如果不想要排序后的值,想要排序后的索引,可以这样做
    • 4.字符串类型排序
    • 5.二维数组排序
    • 6.二维数组获取排序后的索引
    • 7.字典数组排序
    • 8.字典数组获取排序后的索引
    • 9.对象排序
    • 10.对象排序获取排序后的索引
    • 11.一维数组排序【numpy】
    • 12.一维数组获取排序后的索引【numpy】
    • 13.一维数组降序排序【numpy】
    • 14.二维数组排序【numpy】
    • 15.二维数组获取排序后的索引【numpy】
  • 附:python对数组进行排序,并输出排序后对应的索引值
    • 总结

      引言 这三个排序方法应对日常工作基本够用
      先说一下三者的区别
      • sort, sorted 是用在 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]

      # sortnum_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 操作之后的数组就已经不是原来那个数组了,
      debug的时候很麻烦,说完了区别,来具体讲讲使用方法

      用法实例
      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 = nameself.isbn = isbnself.publish_year = publish_yeardef __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 没有 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)# [ 123458 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 arrprint 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 arrayarray.sort(axis=1) #axis=1按行排序,axis=0按列排序print array

      输出结果:
      [[4 3 2]
      [2 1 4]]
      [[2 3 4]
      [1 2 4]]

      总结 【python数组排序方法之sort、sorted和argsort详解】到此这篇关于python数组排序方法之sort、sorted和argsort详解的文章就介绍到这了,更多相关python数组排序方法内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

        推荐阅读