查找最接近零的数字索引(列表)

时间:2015-02-17 15:00:42

标签: python list loops tuples indices

我有一个数字列表,当我绘制它们时,我得到了这个顶帽类型的功能。 FWHM在y轴上出现在零。因此,如果我找出情节达到零的x值(在两个地方),差异将给我FWHM。

但是,列表中的每个数字都是浮点数,所以我必须找到最接近零的数字。 CAX_roots是绘制的列表。我可以使用以下代码找到第一个:

root =  min(abs(x) for x in CAX_roots)
first_root = str(CAX_roots).find(str(root))
print first_root

关于如何找到第二个根的任何帮助/建议?当我尝试继续从first_root值到列表末尾的迭代时,我似乎无法通过错误“列表索引必须是整数,而不是元组”:

CAX_roots2 = CAX_roots[first_root,:]
root2 =  min(abs(x) for x in CAX_roots2)

或者,如果有更好的方法吗?提前谢谢!

Plotting CAX_roots, where i am interested in finding the values where the plot goes through zero

2 个答案:

答案 0 :(得分:0)

如果此代码

CAX_roots2 = CAX_roots[first_root,:]
root2 =  min(abs(x) for x in CAX_roots2)

与您的程序中显示的完全相同,问题来自[first_root,:]中的逗号。您需要将其指定为[first_root:]

尾随逗号是指定具有单个元素的元组的方式。

>>> a = 1
>>> b = 1,
>>> type(a)
<type 'int'>
>>> type (b)
<type 'tuple'>
>>> 

但是,正如@Reticality指出的那样,first_root是一个浮点数,而不是你想要的指数。

相反,如果你想到你想要找到的东西 - 那就是不平等(f(x) >=0)的间隔。所以使用:

signs = [x >= 0 for x in CAX_roots]
first_root_index = signs.index(True)
second_root_index = signs[first_root_index:].index(False) + first_root_index - 1
first_root = CAX_roots[first_root_index]
second_root = CAX_roots[second_root_index]

正如你在这里看到的那样

>>> l = [-2, -1, 0, 2, 3, 0, -1]
>>> v = [x >=0 for x in l]
>>> v
[False, False, True, True, True, True, False]
>>> v.index(True)
2
>>> v[2:].index(False)
4
>>> l[2]
0
>>> l[2+4-1]
0
>>>

为了保持健全,如果您的数据永远不会变为正数或返回负数,则需要处理来自ValueError来电的index()个例外。

答案 1 :(得分:0)

关闭。由于尾随逗号,您有一个元组作为索引。您可能不希望first_root作为索引,因为它是一个浮点数。如果要从列表中删除值,请执行以下操作:

CAX_roots2 = CAX_roots[:]  # So they don't reference the same object
CAX_roots2.pop(CAX_roots2.index(first_root))  # Pop the first root's index