问题:对于一列数,求出其中的第二大值。
一、求数组中第二大值的错误方式(常见)
查看了很多资料,很多博客主要介绍的方法和思路有以下2种:
- sorted() 进行排序后,直接对数去进行取值,将数组倒数第二个值当做数组的第二大值;
- 自定义排序 例如:https://blog.youkuaiyun.com/together_cz/article/details/77771125
但是很少考虑数组中的最大值是否唯一。当数组的有多个最大值时,需要判断并进行优化。当数组中有多个最大值或者不确定最大值是否唯一时,需要进行改进优化。
错误案例
(1) sorted()先对数据递增排序后,取倒数第二个数。
——只适用于数组只有唯一一个最大值,当数组含有多个最大值时不适用。
数组只有一个最大值时:正确。


数组含有多个最大值时:结果错误。


(2)自定义函数. 例如:https://blog.youkuaiyun.com/together_cz/article/details/77771125
由此可以看出:当数组中有多个最大值或者不确定最大值是否唯一时,需要进行改进优化。
二、如何求数组中的第二大的数?
在考虑数组可能含有多个最大值的情况下,如何正确找到数据的第二大值?总结了以下三种方式:
- 方法1:排序+判断数组有无第二大值
- 方法2:将数组转化为集合去重+排序+取值
- 方法3:自定义排序
1. 方法一:排序+判断数组有无第二大值+取值
(1)思路
- step1:找出数据中最大数的个数,记为x
- step2:判断数组中最大值的个数与数据元素个数的关系:
若数组中最大数的个数 == 数组元素的个数:则数组中的元素都是最大值,因此数组没有第二大值;
若数组中最大数的个数< 数组元素的个数:数组中存在第二大的数,且对数组排序后,第二大数的位置是:-1-x
(2)实践:

输出的结果如下:

2. 方法二:列表元素去重+排序+取值
列表元素去重可以用2种简单方式:
- (1)将列表转化为集合
- (2)导入numpy包,使用np.unique()函数
A. 将列表转为结集合:
输出的结果为:

此时,不对集合判断元素个数也是可以的,当取值位置不存在时,运行程序会报错。
B. 使用np.unique()进行去重:

输出的结果为:

3. 方法三:自定义排序

输出的结果为:

ps:文中python代码的链接地址:https://download.youkuaiyun.com/download/Anny_Song/12042828
本文总结了在Python中求解数组第二大值的三种方法,包括排序加判断、去重排序以及自定义排序。针对数组可能存在的多个最大值情况进行了优化,详细解析了每种方法的思路和实践过程。

被折叠的 条评论
为什么被折叠?



