在这种情况下如何表达j + 1?

时间:2014-12-07 17:04:49

标签: python

我正在编写一段代码来过滤一些数据,而且我遇到了一个问题。我目前有:

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

我不确定如何以另一种方式表达我的意思。

2 个答案:

答案 0 :(得分:1)

您应该使用更多描述性变量名来避免代码中存在的众多错误

我假设在您的函数参数中,wavelengthfilterwavelength是列表。因此,让我们通过使用复数名称来明确这一点:

def accountforfilter(wavelengths, flux, filterwavelengths, throughput)

一旦你这样做,像这样的比较就不再有意义了:

if wavelengths == filterwavelengths:

elif filterwavelengths < wavelengths < filterwavelengths[j+1]:

特别是在第二次比较中,您将列表与列表与列表项进行比较。

最后,在使用for时,循环变量(您的ij)设置为单个列表而不是索引。因此,您绝对不能将这些值作为索引。要反映这一点,您应该恰当地命名它们:

# one wavelength out of all wavelengths
for wavelength in wavelengths:

    # one filterwavelength out of all filterwavelengths        
    for filterwavelength in filterwavelengths:

另请注意,使用for时,无法更改迭代方式。每次迭代,下一个项目都将被处理;你不能跳过或重复一个项目(因为你似乎正在尝试使用i += 1j += 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是危险的。如果没有关于你正在努力实现什么的更多信息,进一步提出建议会有点困难。