这是一个新任务:我从数组中选择数据时遇到以下问题
a = [1100, 1140, 1258, 1800, 2100, 2365]
我想从中选择严格低于 2000 的值和严格高于 2000 的值......在这种情况下是 1800 和 2100
任何帮助,将不胜感激
这是一个新任务:我从数组中选择数据时遇到以下问题
a = [1100, 1140, 1258, 1800, 2100, 2365]
我想从中选择严格低于 2000 的值和严格高于 2000 的值......在这种情况下是 1800 和 2100
任何帮助,将不胜感激
那是你需要的吗?
>>> a = [1100, 1140, 1258, 1800, 2100, 2365]
>>> max(x for x in a if x < 2000)
1800
>>> min(x for x in a if x > 2000)
2100
当然,还有更多(也许更好)的解决方案。
上述解决方案使用了所谓的生成器表达式(在 Python 2.4 中引入),即这种方法不会创建新的列表对象。它只是迭代a
两次。正如其他人指出的那样,您可以在a
已经排序时将其减少为单次迭代。
更新(根据您上面的评论):
>>> from itertools import izip
>>> a = [1100, 1140, 1258, 1800, 2100, 2365]
>>> b = ['r', 's', 't', 'u', 'v', 'w']
>>> max((a,b) for a,b in izip(a,b) if a < 2000)
(1800, 'u')
>>> min((a,b) for a,b in izip(a,b) if a > 2000)
(2100, 'v')
这种方法在 2 元组列表中搜索极值,例如[(1100, 'r'), (1140, 's'), ...]
。这意味着对于搜索极值,b
如果列表中的值相等,则考虑列表中的值a
,参见此答案。
只是为了让您知道:为了获得与第一种方法完全相同的行为,即实际上仅a
在极值搜索期间评估值,您可以使用
from operator import itemgetter
from itertools import izip
min(((a,b) for a,b in izip(a,b) if a > 2000)), key=itemgetter(0))
这使用项目 0,即 2 元组中的第一个项目,即a
用于搜索最小值的列表中的值。
如果您使用的是 NumPy:
a[a>2000].min()
a[a<2000].max()
NumPy 数组可以通过布尔数组进行索引:您只选择满足给定条件的元素(这里,无论您是高于还是低于 2000),输出本身就是一个 NumPy 数组(称为ndarray
)[实际上,什么是返回的是您的初始数组的子集,相同的元素]。因为它是一个ndarray
,你可以使用它的min
和max
方法。
你会承认语法非常易读,对吧?
但是如果你在没有 numpy 的情况下被困住,你总是可以尝试类似的东西
min(i for i in a if i>2000)
max(i for i in a if i<2000)
如果你真的是指低于 2000 的最高值和高于 2000 的最低值,那么你可以通过
In [3]: max([x for x in a if x < 2000])
Out[3]: 1800
In [4]: min([x for x in a if x > 2000])
Out[4]: 2100
这是如何运作的?列表推导[x for x in a if x < 2000]
选择所有小于 2000 的元素。然后,只需查找最大值。
如果您知道列表已经排序,则可能有更有效的方法。
我只是对数组进行排序,然后当你找到高于 2000 的第一个值时,取那个和前一个。