2012-12-01 32 views
-2

我有這個代碼創建一個填充零的矩陣。我想用創建蛇形對象時給出的「符號」替換一些零。然後我想用矩陣替換矩陣中的零,而不增加矩陣中元素的總量。Python:嘗試查找矩陣索引時出錯

隨着蛇類我想確保只有零改寫我的「保增長」的功能,但我得到的錯誤:

ValueError: (1, 4) is not in list 

當我敢肯定,位置實際上確實存在!每次運行程序時,錯誤代碼都是不同的,因爲隨機生成了座標。以下是我的代碼:

class field: 
def __init__(self): 

    self.table= [ [ "0" for i in range(10) ] for j in range(10) ] 

    def printfield(self): 
    for row in self.table: 
      print (row) 


Class snake: 

    def __init__(self,sign): 
    self.sign = sign 
    self.x = random.randint(1,9) 
    self.y = random.randint(1,9)  

    field.table[self.x][self.y] = sign 


    def growth(self, list, index, element): 
    if list[index] != 0: 
     return False 
    else: 
     field.table[self.x-v*b][self.y-v*c] = element 


    def increase(self,p,b,c):            

     for v in range(p+1): 
       self.growth(field.table,field.table.index((self.x-v*b,self.y-v*c)), self.sign) 
+1

請上帝永遠不要命名你的變量**列表**。 – Aesthete

+1

哎呀,對不起。那麼,我的代碼是120線長,所以我不敢把它全部發布,但我得到了我想要的答案,所以幸運的是它解決了! Ps。它在我的真實代碼中並沒有真正的名稱列表,我只是認爲我應該在將它發佈到這裏之前將其翻譯爲英文:) – Nekroz

回答

1

您在二維列表中將您的索引與列表中的值混淆。聲明

field.table.index((self.x-v*b, self.y-v*c)) 

尋找一個(在給定的錯誤情況)(1, 4)名單field.table,這當然是不存在的內部。你可能想要訪問field.table[1][4]。您可以將元組作爲變量傳遞給growth,並將其元素用作列表的索引,或將field.table[self.x-v*b]作爲增長列表,並將self.y-v*c作爲該列表中訪問的索引。

另外,您正在填寫"0" s的列表,但在growth函數中檢查0

+0

謝謝!非常好的解釋,我現在得到它!我會嘗試使用field.table [self.x-v * b] [self.y-v * c]來訪問它。 非常感謝您指出這一點,我完全沒有想到這一點!是否有可能將if子句更改爲!=「0」? – Nekroz

1

錯誤來自您的增加方法而不是您的增長方法。發生在您致電table.index((self.x-v*b,self.y-v*c))時。我不清楚你在調用索引表時想做什麼,但是索引方法返回列表中某個值的位置。因此,例如:

>>> A = [0, 1, 5, 10] 
>>> A.index(5) 
2 

表似乎是整數的名單列表,這樣,當你調用table.index((1, 4)),元組(1, 4)不在索引中找到。也許你想要table[1][4]

更新:

我認爲這是你想要什麼:

self.growth(field.table, (self.x-v*b, self.y-v*c), self.sign)

和替換field.table[self.x-v*b][self.y-v*c]field.table[index[0]][index[1]]

(self.x-v*b, self.y-v*c)是你想要的指標,一旦你將它傳遞到成長,你需要使用它的參數名稱來引用它。

+0

我想查看列表列表中的位置,即增長方法將添加元素的位置零或其他東西。如果是其他東西,我希望它返回False值。我希望這樣做更清楚一點! – Nekroz

+0

非常感謝您抽出寶貴時間。我會嘗試你所建議的一切! – Nekroz