在python中的数字列表中立即获得最小值

cut*_*eth 12 python lower-bound upperbound

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

>>>num_list=[1,2,3,4]
>>> min(num_list)
1
>>> max(num_list)
4
Run Code Online (Sandbox Code Playgroud)

如何找到下一个最低到3或下一个最大到2?预期的结果是2和3.

Jua*_*pes 5

我看到你的问题被标记为[下限]和[上限]。如果您的列表已排序,Python 具有相当于 C++ <algorithm> 的lower_boundupper_bound. 它们在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
Run Code Online (Sandbox Code Playgroud)


gbo*_*ffi 5

TL; DR要么min(n for n in my_list if n>lower_bound)max(n for n in my_list if n<upper_bound)


查找立即最小值立即最大值的更快的替代方法是numpy

>>> 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
Run Code Online (Sandbox Code Playgroud)

如果您不习惯使用numpy机器,并且只想处理一份清单

>>> a = list(a)
Run Code Online (Sandbox Code Playgroud)

然后您可以使用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
>>>
Run Code Online (Sandbox Code Playgroud)

当然,使用列表可以得到相同的结果,但是要注意性能上的差异:使用ipython%timeit获取时序,numpy对于100000个元素数组/先前示例的列表,我使用871 µs 使用常规列表,使用13.8 ms使用常规列表。

HTH,巧


圣经后

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