获取python中数字列表中的最小值



如何获得python中提供的值的下一个最小值?它有任何内置功能吗?

>>>num_list=[1,2,3,4]
>>> min(num_list)
1
>>> max(num_list)
4

我如何才能找到3的次低值或2的次高值?预期结果分别为2和3。

TL;DRmin(n for n in my_list if n>lower_bound)max(n for n in my_list if n<upper_bound)


查找立即最小值即时最大值

>>> import numpy as np
>>> np.random.seed(10)
>>> a = np.random.random(10000)
>>> a[a>0.7].min()
0.69999533217645671
>>> a[a<0.7].max()
0.70003449227846715

如果您对使用numpy机器感到不舒服并且想要简单地处理列表

>>> a = list(a)

然后您可以将minmax内建与生成器一起使用表达式

>>> min(n for n in a if n>0.7)
0.69999533217645671
>>> max(n for n in a if n<0.7)
0.70003449227846715
>>>

当然,使用列表会得到相同的结果,但要注意性能上的差异:使用ipython%timeit来获得定时,我使用numpy有871µs,使用常规列表有13.8 ms,用于前面示例的100000个元素的阵列/列表。

HTH,ciao


后期脚本

我的答案中的解决方案都是O(n),与使用排序的方法的O(n log n)相比——此外,对于大数据集,numpy方法应该(斜体,因为我手头没有测试…)受到一个小的乘法因子的影响。

我看到你的问题被标记为[下界]和[上界]。如果你的列表是排序的,Python有一个等价的C++<算法>'s的CCD_ 11和CCD_。它们在bisect模块中。它们返回某个特定值范围的开始和结束后的索引。

In [1]: import bisect
In [2]: A = [0, 1, 3, 3, 5]
In [3]: A[bisect.bisect_left(A, 3)-1]
Out[3]: 1
In [4]: A[bisect.bisect_right(A, 3)]
Out[4]: 5

仅次于3:

max([x for x in num_list if x < 3])

仅次于2:

min([x for x in num_list if x > 2])

使用heapq.nlargestheapq.nsmallest

import heapq
num_list = [1, 2, 3, 4]
heapq.nlargest(2, num_list)
heapq.nsmallest(2, num_list)
#>>> [4, 3]
#>>> [1, 2]

您可以使用sorted:

>>> l=sorted(num_list,reverse=True)
>>> l[l.index(3)+1]
2

但正如Frerich Raabe在评论中所说,作为一种更像蟒蛇的方式,你不需要痛苦地列出整个列表,你可以在低于3:的元素上找到最大值

>>> max(i for i in num_list if i<3)
2

对于2之后的下一个最大值,您可以使用min:

>>> min(i for i in num_list if i>2)
3

提供的答案很好,但如果我能提出建议的话——如果有时值可以重复,比如

num_list = [2, 2, 4, 4, 6, 7, 8, 9]

等等,仅仅对列表进行排序并获得第一个索引可能不是你想要的。

通过首先通过set()传递它,您将确保每个条目都是一个singleton:

def sorted_ordered_list(sequence):
    return sorted(list(set(sequence)))

然后,您可以为您要查找的任何值对返回的list进行索引,从索引0处的最低值到最高值。

示例:

>>> my_list = [1, 5, 4, 3, 6, 3, 8, 3, 6, 7, 4, 2, 6, 7, 9, 8, 8]
>>> sorted_ordered_list(my_list)
[1, 2, 3, 4, 5, 6, 7, 8, 9] # now index the list for the desired value
>>> 

您可以使用以下方法:

num_list = [1,2,3,4]   
inds = sorted(range(len(num_list)), key=lambda k: num_list[k])

然后,inds[1]将包含下一个最低元素的索引,依此类推。此外,您可以使用以下代码而不进行排序:

minv = min(num_list)    
nmin = min(nm for nm in num_list if nm > minv)
maxv = max(num_list)
nmax = max(nm for nm in num_list if nm < maxv)

相关内容

  • 没有找到相关文章

最新更新