2014-03-06 46 views
1

我有一個快速的問題,這行代碼Python的__getitem__錯誤

row[time] == numbers[num_time]: 

是給我的錯誤:

int has no attribute __getitem__ 

經過一番研究,我發現,當您嘗試出現此錯誤在int上調用列表號碼。在這種情況下,我發送了一個3個數字的列表,並想要在第二個數字列表中遞歸(我們不允許使用循環,但:(),看看第二個列表中的任何元素是否在第一個列表中。名單如果是,會做某件事,但如果他們arent,功能應該移動到行列表中的下一個,做同樣的事情,直到行空

def row_find(row,numbers,time,num_time): 
    if numbers==[]: 
     return row_find(row[time+1],numbers,time+1,num_time=0) 
    if row== []: 
     return row 

    else: 
     if row[time]== numbers[num_time]: 
      num_time=0 
      return row,row_find(row[time+1],numbers,time+1,num_time) 
     else: 
      return row,row_find(row[time],numbers[num_time+1],time,num_time) 


lst=[5,2,9] 
num_lst=[5, 10, 23, 31, 44] 
row_find(lst,num_lst,0,0) 
+0

有時,'row_find'返回一個元組,有時候會返回一個列表('row')。你確定這是你想要做的嗎? –

回答

1

這裏:。

row_find(row[time],numbers[num_time+1],time,num_time) 

您使用numbers[num_time+1]這不是一個列表。

我THI NK這應該使的伎倆:

def row_find(row,numbers,time,num_time): 
    if numbers==[]: # If numbers list is empty, it make no sense to contiue 
     return False 
    if row== []: # If numbers list is empty, it make no sense to contiue 
     return False 

    if row[time]== numbers[num_time]: #Already found an element that is in both lists 
     print("found -> " + str(time) + " " + str(num_time)) 
     return True 
    else: 
     if num_time < len(numbers)-1: # If remaining elements in numbers 
      if row_find(row,numbers,time,num_time+1): # Check next one 
       return True 
      else: # I 
       if time < len(row)-1: # If remaining element in row 
        return row_find(row,numbers,time+1,0) # check numbers from beginning with next row 
       else: 
        return False # If not, no elements in both lists 


lst=[8,2,9] 
num_lst=[9, 10, 88, 31, 55] 
row_find(lst,num_lst,0,0) 
# found -> 2 0 
+0

不應該翻譯成數字[1]?我只需要它繼續下一個數字,我是否需要把它放在if裏面呢?或將其更改爲num_time + = 1? – Martin

+0

我用工作代碼更新了我的答案,檢查這是否是您需要的 –

0

這裏:

return row,row_find(row[time],numbers[num_time+1],time,num_time) 

您的整數關口作爲row_findnumbers說法。你必須通過一個列表。您是否在尋找slices

0

你想幹什麼

row_find(row[time],numbers[1:],time,num_time) 

其中[1:]返回從第二個元素開始的列表。

您也可以使用Python布爾評估。如果一個序列是空的,其被評估爲False,所以不是

if numbers==[]: 

,你可以這樣做:

if not numbers: 
1

檢查什麼是你送的numbers它可能是你發送的東西是不是一個列表。你得到的錯誤是Pythons告訴你,你要求在錯誤的對象上使用函數,attribute __getitem__正在到達列表numbers的索引,像這樣numbers[1]

0

你需要做幾件事情:

首先,檢查你的論點(數字)實際上是一個列表。添加到您的函數的頂部:

if not isinstance(numbers, collections.Iterable): 
    # error! numbers is meant to be a list. report on this error somehow 

和,後面的代碼:

num_lst=[5, 10, 23, 31, 44]num_lst[0] = 5num_list[0++] = 10。如果「數字」是10,那麼​​是什麼意思? (即,10[num_time] - 那應該是什麼意思?)。

而不是通過numbers[num_time+1]作爲參數返回到您的函數,看看使用切片。

相關問題