2013-02-15 61 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