获取 python 中数字列表中的最小值
Get the immediate minimum among a list of numbers in python
如何获得 python 中提供的值的下一个最小值?有内置函数吗?
>>>num_list=[1,2,3,4]
>>> min(num_list)
1
>>> max(num_list)
4
如何找到次低的 3 或次大的 2?预期结果分别为2和3。
您可以使用 sorted
:
>>> l=sorted(num_list,reverse=True)
>>> l[l.index(3)+1]
2
但正如 Frerich Raabe 在评论中所说的更 pythonic 的方式,你不需要对整个列表进行排序,你可以找到小于 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 = [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)
倒数第 3 个:
max([x for x in num_list if x < 3])
2 的次大数:
min([x for x in num_list if x > 2])
提供的答案很好,但如果我可以提出建议 - 如果有时值可以重复,例如
num_list = [2, 2, 4, 4, 6, 7, 8, 9]
...等等,只是对列表进行排序并获得第一个索引可能不是您要找的。
首先通过 set()
传递它,您将确保每个条目都是单例:
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
>>>
我看到你的问题被标记为 [lower-bound] 和 [upperbound]。如果您的列表已排序,Python 与 C++ 的 lower_bound
和 upper_bound
等效。它们在 bisect
模块中。它们 return 某个特定值范围开始和结束后的索引。
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
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
如果您不习惯使用 numpy
机器
并想简单地处理一个列表
>>> a = list(a)
然后您可以使用 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
>>>
使用列表,当然,结果相同,但请注意性能差异:使用 ipython
和 %timeit
获取时间,我使用 [= 有 871 µs 15=] 和 13.8 毫秒,使用前面示例的 100000 个元素的常规列表 array/list。
HTH,再见
Post 脚本
与使用排序的方法的 O(n log n) 相比,我的答案中的解决方案都是 O(n) --- 此外,对于大型数据集,numpy
方法 应该(斜体,因为我手头没有测试......)受到一个小乘法因子的影响。
使用heapq.nlargest
和heapq.nsmallest
import heapq
num_list = [1, 2, 3, 4]
heapq.nlargest(2, num_list)
heapq.nsmallest(2, num_list)
#>>> [4, 3]
#>>> [1, 2]
如何获得 python 中提供的值的下一个最小值?有内置函数吗?
>>>num_list=[1,2,3,4]
>>> min(num_list)
1
>>> max(num_list)
4
如何找到次低的 3 或次大的 2?预期结果分别为2和3。
您可以使用 sorted
:
>>> l=sorted(num_list,reverse=True)
>>> l[l.index(3)+1]
2
但正如 Frerich Raabe 在评论中所说的更 pythonic 的方式,你不需要对整个列表进行排序,你可以找到小于 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 = [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)
倒数第 3 个:
max([x for x in num_list if x < 3])
2 的次大数:
min([x for x in num_list if x > 2])
提供的答案很好,但如果我可以提出建议 - 如果有时值可以重复,例如
num_list = [2, 2, 4, 4, 6, 7, 8, 9]
...等等,只是对列表进行排序并获得第一个索引可能不是您要找的。
首先通过 set()
传递它,您将确保每个条目都是单例:
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
>>>
我看到你的问题被标记为 [lower-bound] 和 [upperbound]。如果您的列表已排序,Python 与 C++ lower_bound
和 upper_bound
等效。它们在 bisect
模块中。它们 return 某个特定值范围开始和结束后的索引。
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
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
如果您不习惯使用 numpy
机器
并想简单地处理一个列表
>>> a = list(a)
然后您可以使用 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
>>>
使用列表,当然,结果相同,但请注意性能差异:使用 ipython
和 %timeit
获取时间,我使用 [= 有 871 µs 15=] 和 13.8 毫秒,使用前面示例的 100000 个元素的常规列表 array/list。
HTH,再见
Post 脚本
与使用排序的方法的 O(n log n) 相比,我的答案中的解决方案都是 O(n) --- 此外,对于大型数据集,numpy
方法 应该(斜体,因为我手头没有测试......)受到一个小乘法因子的影响。
使用heapq.nlargest
和heapq.nsmallest
import heapq
num_list = [1, 2, 3, 4]
heapq.nlargest(2, num_list)
heapq.nsmallest(2, num_list)
#>>> [4, 3]
#>>> [1, 2]