这是一项新任务: 从数组中选择数据时出现以下问题
a = [1100, 1140, 1258, 1800, 2100, 2365]
我想从这个arry中选择严格低于2000的值和严格高于2000的值...在这种情况下1800和2100
任何帮助将不胜感激
答案 0 :(得分: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
肯定有更多(也许更好)的解决方案。
上述解决方案使用所谓的generator expressions(在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
中的值,参见this answer。
只是为了让您知道:为了获得与第一种方法完全相同的行为,即在极值搜索期间实际上只评估来自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
中的值,用于搜索最小值。
答案 1 :(得分:2)
如果您使用的是NumPy:
a[a>2000].min()
a[a<2000].max()
NumPy数组可以由布尔数组索引:只选择满足给定条件的元素(这里,无论你是高于还是低于2000),输出本身是一个NumPy数组(称为{{1实际上,返回的是初始数组的一个子集,相同的元素]。由于它是ndarray
,您可以使用其ndarray
和min
方法。
你会承认语法很可读,对吗?
但如果你没有笨拙地坚持下去,你可以尝试像
这样的东西max
答案 2 :(得分: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的元素。然后,只查找最大值。
如果您知道列表已经排序,则可能有更有效的方法。
答案 3 :(得分:0)
我只是对数组进行排序,然后当你发现第一个值高于2000时,取一个和前一个。