在此選擇特定點是一個新的任務: 我有從陣列選擇數據如下問題從一個數組
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
有可能會有更多(也許更好)的解決方案。
上述解決方案使用所謂的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
中的值。
我只想排序數組,然後當你找到的第一個值大於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的元素。然後,只查找最大值。
如果您知道列表已經排序,那麼可能有更有效的方法。
如果您使用NumPy的:
a[a>2000].min()
a[a<2000].max()
NumPy的陣列可以通過boolean數組編制索引:僅選擇滿足給定條件的元素(在此,不管你的上方或下方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)
這是不完全清楚,我試圖達到的目標。你的代碼到目前爲止沒有意義('compute.CD(); a.append(CD)'部分)。請嘗試重新提出您的問題,或者其他人可以提供幫助。 –
我簡化了它,我希望它更清晰 – CharlieShe
我認爲你仍然缺少一些描述......「嚴格低於」意味着下面的所有值,但我不認爲這就是你的意思。我認爲你的意思是2000年以下的最高值和2000年以上的最低值。 –