我正在编写一段代码来过滤一些数据,而且我遇到了一个问题。我目前有:
def accountforfilter(wavelength, flux, filterwavelength, throughput):
filteredwavelength=[]
filteredflux=[]
for i in wavelength:
for j in filterwavelength:
if wavelength==filterwavelength:
j=filterwavelength.index(wavelength)
filteredwavelength.append(wavelength)
filteredflux.append(flux*throughput)
elif filterwavelength<wavelength<filterwavelength(j+1):
filteredwavelength.append(wavelength)
filteredflux.append(flux*f(wavelength))
#f is a function that interpolates using y=mx+c when wavelength and filterwavelength are not the same
elif wavelength<filterwavelength:
i+=1
elif wavelength>filterwavelength:
j+=1
return filteredwavelength, filteredflux
我遇到的问题是:
elif filterwavelength<wavelength<filterwavelength(j+1):
此行不起作用,我收到错误:
TypeError: 'list' object is not callable
如果我将圆括号改为方括号,即
elif filterwavelength<wavelength<filterwavelength[j+1]:
我收到错误:
TypeError: list indices must be integers, not float
我不确定如何以另一种方式表达我的意思。
答案 0 :(得分:1)
您应该使用更多描述性变量名来避免代码中存在的众多错误。
我假设在您的函数参数中,wavelength
和filterwavelength
是列表。因此,让我们通过使用复数名称来明确这一点:
def accountforfilter(wavelengths, flux, filterwavelengths, throughput)
一旦你这样做,像这样的比较就不再有意义了:
if wavelengths == filterwavelengths:
elif filterwavelengths < wavelengths < filterwavelengths[j+1]:
特别是在第二次比较中,您将列表与列表与列表项进行比较。
最后,在使用for
时,循环变量(您的i
和j
)设置为单个列表项而不是索引。因此,您绝对不能将这些值作为索引。要反映这一点,您应该恰当地命名它们:
# one wavelength out of all wavelengths
for wavelength in wavelengths:
# one filterwavelength out of all filterwavelengths
for filterwavelength in filterwavelengths:
另请注意,使用for
时,无法更改迭代方式。每次迭代,下一个项目都将被处理;你不能跳过或重复一个项目(因为你似乎正在尝试使用i += 1
和j += 1
。如果你需要这样做,你将不得不使用经典的while循环:
i, j = 0, 0
while i < len(wavelengths):
while j < len(filterwavelengths):
if condition:
i += 1
else:
j += 1
所以,总的来说,函数可能看起来像这样(尽我所能去了解发生了什么):
def accountforfilter (wavelengths, flux, filterwavelengths, throughput):
filteredWavelengths = []
filteredFluxes = []
i, j = 0, 0
while i < len(wavelengths):
wavelength = wavelengths[i]
while j < len(filterwavelengths):
filterwavelength = filterwavelengths[j]
if wavelength == filterwavelength:
filteredWavelengths.append(wavelength)
filteredFluxes.append(flux * throughput)
elif j + 1 < len(filterwavelengths) and filterwavelength < wavelength < filterwavelengths[j + 1]:
filteredWavelengths.append(wavelength)
filteredFluxes.append(flux * f(wavelength))
if wavelength < filteredwavelength:
i += 1
else:
j += 1
# increase j even when both are equal, otherwise we end up in an infinite loop
return filteredWavelengths, filteredFluxes
答案 1 :(得分:0)
一些事情:这句话:
for i in wavelength:
在wavelength
列表中生成一系列值,而不是索引。
如果您还想要索引,请使用
for i, wv in enumerate(wavelength):
...
类似于j
循环。此外,如果值为浮点,则此比较:wavelength==filterwavelength
是危险的。如果没有关于你正在努力实现什么的更多信息,进一步提出建议会有点困难。