我有一个数字列表,当我绘制它们时,我得到了这个顶帽类型的功能。 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)
或者,如果有更好的方法吗?提前谢谢!
答案 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