2013-02-15 58 views
1

我有一種感覺,這個問題有一個簡單的答案,但我無法編寫許多代碼行來得到答案。我希望有人可能會給我一些東西,這將使我的生活更容易在Python的列表解析。簡單的Python列表理解

什麼我是這樣的:

highest_peak = sorted([(self.Y[x]-self.background_model[x]) for x in peaks_index_list])[0] 

如何獲得指數從這種情況出現的peaks_index_list的highest_peak(x)的?

index_of_highest_peak = sorted(???)[0] 
index_of_second_highest_peak = sorted(???)[1] 

感謝您的任何幫助。

回答

2

你應該選形式的元組(價值指數)的列表 -

info = sorted((self.Y[x]-self.background_model[x],x) for x in peaks_index_list) 

現在您最高峯的指標爲:

info[-1][1] 

或者,你可以解壓多一點很好:

highest_peak_value,highest_peak_index = info[-1] 

(最高峯是最後的排序列表,因爲我們沒有指定reverse=True

第二最高峯指數是:

​​

等。

+0

太棒了!我總是忘記元組以及添加兩個變量(值,索引)在循環中迭代的想法(忘記了所謂的)。這是一個很好的信息,非常有用,非常感謝。 – chase 2013-02-15 16:49:24

3

如果您使用numpy的,你可以

import numpy as np 
highest_peak = np.asarray(highest_peak) 

max_index = highest_peak.argmax() 
+0

謝謝你的回答,這是一個非常容易理解和簡潔的代碼片斷。我認爲[mgilson](http://stackoverflow.com/users/748858/mgilson)具有更多元化的形式來獲得第二和第三排名項目,但這仍然非常有用。 – chase 2013-02-15 16:51:59

2

(注意:根據意見修改)

添加索引來進行排序的對象:

highest_peak, index = sorted([(self.Y[x]-self.background_model[x], x) 
    for x in peaks_index_list])[0] 

(原來我建議使用枚舉(),當你想要列舉的元素的索引時,這非常棒。在這種情況下,peaks_index_list已經是海報之後的索引。)

highest_peak, index = sorted([(self.Y[x]-self.background_model[x], i) 
    for i, x in enumerate(peaks_index_list]))[0] 
+0

OP希望索引'x',而不是索引'i'(如果我理解正確) – mgilson 2013-02-15 16:43:24

+0

是的,我想要'x'值,但這仍然有用,因爲它通常會引起對枚舉()的注意,這可能是任何Google的問題都與此類似。謝謝,tdelaney。 – chase 2013-02-15 16:54:35

+0

哎呀,我改變它,而你打字!我想我會把舊的加回去。 – tdelaney 2013-02-15 16:55:50

3

我把它的高峯指數爲self.Y[i] - self.background_model[i]i?如果你想要的是最高峯的指標:

max(peaks_index_list, key=lambda i: self.Y[i] - self.background_model[i]) 

同樣的,如果你真的想排序列表,使用上面的關鍵to sort peaks_index_list

+0

這是真的,但它不會給OP第二大 - 雖然你可以通過使用'sorted'而不是'max'來實現,我想。 – mgilson 2013-02-15 16:49:34

+0

@mgilson這就是我想到的第二部分答案。從索引列表開始有點繁瑣,但基於OP的字面問題,他並不是很明顯,他需要自己的高峯清單。 – kojiro 2013-02-15 18:00:40