python数组排序方法详解(sort, sorted,argsort)

这三个排序方法应对日常工作基本够用

先说一下三者的区别
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]
# 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 操作之后的数组就已经不是原来那个数组了,debug的时候很麻烦


说完了区别,来具体讲讲使用方法

目录索引

  • 1.升序排序
  • 2.降序排序
  • 3.如果不想要排序后的值,想要排序后的索引,可以这样做
  • 4.字符串类型排序
  • 5.二维数组排序
  • 6.二维数组获取排序后的索引
  • 7.字典数组排序
  • 8.字典数组获取排序后的索引
  • 9.对象排序
  • 10.对象排序获取排序后的索引
  • 11.一维数组排序【numpy】
  • 12.一维数组获取排序后的索引【numpy】
  • 13.一维数组降序排序【numpy】
  • 14.二维数组排序【numpy】
  • 15.二维数组获取排序后的索引【numpy】
  • 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 没有 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]]
    

    来源:什么都干的派森

    物联沃分享整理
    物联沃-IOTWORD物联网 » python数组排序方法详解(sort, sorted,argsort)

    发表评论