2014-12-07 26 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