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.
我看到你的问题被标记为[下限]和[上限]。如果您的列表已排序,Python 具有相当于 C++ <algorithm> 的lower_bound和upper_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)
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)
然后您可以使用min和max内置函数以及生成器表达式
>>> 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方法应该使用(斜体,因为我手头没有测试... )会受到较小的乘法因子的影响。
| 归档时间: |
|
| 查看次数: |
3754 次 |
| 最近记录: |