2012-12-01 103 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