0

这是一个新任务:我从数组中选择数据时遇到以下问题

a = [1100, 1140, 1258, 1800, 2100, 2365]

我想从中选择严格低于 2000 的值和严格高于 2000 的值......在这种情况下是 1800 和 2100

任何帮助,将不胜感激

4

4 回答 4

2

那是你需要的吗?

>>> 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用于搜索最小值的列表中的值。

于 2012-09-06T16:00:16.517 回答
2

如果您使用的是 NumPy:

a[a>2000].min()
a[a<2000].max()

NumPy 数组可以通过布尔数组进行索引:您只选择满足给定条件的元素(这里,无论您是高于还是低于 2000),输出本身就是一个 NumPy 数组(称为ndarray)[实际上,什么是返回的是您的初始数组的子集,相同的元素]。因为它是一个ndarray,你可以使用它的minmax方法。

你会承认语法非常易读,对吧?

但是如果你在没有 numpy 的情况下被困住,你总是可以尝试类似的东西

min(i for i in a if i>2000)
max(i for i in a if i<2000)
于 2012-09-06T16:14:06.863 回答
1

如果你真的是指低于 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 的元素。然后,只需查找最大值。

如果您知道列表已经排序,则可能有更有效的方法。

于 2012-09-06T16:02:55.983 回答
0

我只是对数组进行排序,然后当你找到高于 2000 的第一个值时,取那个和前一个。

于 2012-09-06T16:00:16.377 回答