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.升序排序
# 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.⼆维数组排序python获取数组长度
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', 2 013], ['⼈的解放', '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': 20 13}, {'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': 201 4}]
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]]

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。