python数组排序方法之sort、sorted和argsort详解
作者:什么都干的派森 发布时间:2021-02-01 19:26:12
标签: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]
# 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.二维数组排序
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]]
附: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]]
来源:https://blog.csdn.net/weixin_43721000/article/details/120504199


猜你喜欢
- Python FastAPI请求参数传递FastAPI多参数传递类型FastAPI通过模板来匹配URL中的参数列表,大致有如下三类方式传递参
- PDO::preparePDO::prepare — 准备要执行的SQL语句并返回一个 PDOStatement 对象(PHP 5 >
- 1. logging日志的介绍在现实生活中,记录日志非常重要,比如:银行转账时会有转账记录;飞机飞行过程中,会有个黑盒子(飞行数据记录器)记
- 模糊数据库指能够处理模糊数据的数据库。一般的数据库都是以二直逻辑和精确的数据工具为基础的,不能表示许多模糊不清的事情。随着模糊数学理论体系的
- 编写XHTML代码的规则要比编写HTML要严格得多,类似下面的代码在HTML中是有效的,但在XHTML中则是无效的。 [javascript
- 1. 引言在使用Python的时候,通常会出现如下场景:array = [1, 2, 3, 3, 2, 1, 0, 2]获取array中元素
- Go的标准库中有一个类型叫条件变量:sync.Cond。这种类型与互斥锁和读写锁不同,它不是开箱即用的,它需要与互斥锁组合使用:// New
- 引言接口测试就是数据的测试,在测试之前,需要准备好测试数据,而测试数据可以用数据库、excel、txt和csv方式,当然还有一种方式,那就是
- 一、使用+号添加列表元素一般情况下两个列表合并起来也是一种添加元素的方法,只要使用+号直接进行运算就可以了,下面是演示代码。name1 =
- 对于当前数据库的监控方式有很多,分为数据库自带、商用、开源三大类,每一种都有各自的特色;而对于 mysql 数据库由于其有很高的社区活跃度,
- 一、桌面应用软件桌面应用软件是基于GUI(Graphical User Interface,图形用户界面)交互式程序,需要实现GUI库实现前
- 1 前言在 Java 和 js 中,lambda箭头函数是十分常见的操作,这种表达方式在使用时非常的简便。在python的语法中也有应用场景
- 如下所示: out = subprocess.getstatusoutput('adb shell pm
- 实际的项目,存在多张表的关联关系。不可能在一张表里面就能检索出所有数据。如果没有表连接的话,那么我们就需要非常多的操作。比如需要从A表找出限
- 问一下谁知道如何用 javascript 获取硬盘信息1.获得硬盘当前有几个盘符.2.每个盘符的 大小,已经使用的大小,和没有使用的大小原理
- 如下所示:hist = model.fit(x,y, epochs=epoch_num, batch_size=32,callbacks=e
- 简介在日常的Python开发中,处理时间和日期的需求是非常常见的。尽管Python内置了 datetime 和 time 模块,但在某些情况
- 前段时间和哥们胡侃的时候还说腾讯抄的有水平,不过这次我溴了,腾讯房产被新浪乐居给幽默了一把。乐居:http://bj.house.sina.
- 前言在laravel项目开发中,经常使用到公共函数,那如何在laravel配置全局公共函数呢??下面话不多说了,来一起看看详细的介绍吧方法如
- 一、概述有时候会在一台主机上安装多个不同的Python版本,用以运行不同时期开发的项目, 而在这些不同的Python版本上有时又会加装不同的