2014-12-07 67 views
-1

我在写一段代码来过滤一些数据,并且遇到了一个问题。我目前有:如何在这种情况下表达j + 1?

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

您必须在您的if语句中首次提及'filterwavelength'。 – xnx 2014-12-07 17:08:41

+0

'for filter in filterwavelength','j = filterwavelength.index(wavelength)' - 你应该使用更多的描述性变量名来避免这些错误。 – poke 2014-12-07 17:09:26

+0

不重用该变量。 'j + = 1'没有意义。另外,请记住,'i + = 1''' i'会在稍后“重置”。做一个调试会话。 – 2014-12-07 17:09:52

回答

0

有几件事情:这种说法:

for i in wavelength: 

产生一个序列中的wavelength列表,而不是索引他们。

如果你想索引以及使用

for i, wv in enumerate(wavelength): 
    ... 

同样为j循环。而且,这个比较:如果值是浮点,则wavelength==filterwavelength是危险的。如果没有更多关于你想要达到的目标的信息,有点难以进一步提供建议。

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

充分利用糟糕的代码。 – Matthias 2014-12-07 18:39:36