2012-09-06 51 views
0

在此選擇特定點是一個新的任務: 我有從陣列選擇數據如下問題從一個數組

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

我想從這個選擇哈利是嚴格低於2000的值和一個嚴格高於2000 ......這是在這種情況下,1800至2100

任何幫助,將不勝感激

+0

這是不完全清楚,我試圖達到的目標。你的代碼到目前爲止沒有意義('compute.CD(); a.append(CD)'部分)。請嘗試重新提出您的問題,或者其他人可以提供幫助。 –

+0

我簡化了它,我希望它更清晰 – CharlieShe

+3

我認爲你仍然缺少一些描述......「嚴格低於」意味着下面的所有值,但我不認爲這就是你的意思。我認爲你的意思是2000年以下的最高值和2000年以上的最低值。 –

回答

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'), ...]。這意味着,如果搜索極值,如果列表a的值相等,則參考列表b中的值,請參閱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

你不需要'[]'括號:genexp和listcomp一樣工作。 – DSM

+0

取決於Python版本... –

+0

帝斯曼,我只是看這個:-) –

0

我只想排序數組,然後當你找到的第一個值大於2000,採取一個和前一個。

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的元素。然後,只查找最大值。

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

2

如果您使用NumPy的:

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

NumPy的陣列可以通過boolean數組編制索引:僅選擇滿足給定條件的元素(在此,不管你的上方或下方2000) ,輸出本身就是一個NumPy數組(稱爲ndarray)[實際上,返回的是初始數組的子集,相同的元素]。因爲它是ndarray,您可以使用其minmax方法。

你會承認語法是非常可讀的,對吧?

但如果找你堅持不numpy的,你總是可以嘗試像

min(i for i in a if i>2000) 
max(i for i in a if i<2000)