多维数组设置多行/列

时间:2014-03-10 01:20:38

标签: python arrays multidimensional-array

所以我在python中遇到了一个奇怪的问题。我正在使用下面的代码创建对象所在位置的图。这是我的代码:

def GoForward(self, duration):
    if (self.TowardsX - self.X == 0):
        Myro.robot.motors(self.Speed, self.Speed)
        Myro.wait(abs(duration))
        Myro.robot.stop()
        #get the amount of points forward
        divisible = (int) (duration / self.Scale)
        #add them to the direction
        self.TowardsY += divisible
        tempY = self.Y
        for y in xrange(self.Y, divisible + tempY):
            if (y % self.Scale == 0):
                self.Plot[(int) (self.X)][y] = 1
        return
    #calc slope
    slope = (self.TowardsY - self.Y) / (self.TowardsX - self.X)
    tempX = self.X
    tempY = self.Y
    #go forward
    #get the amount of points forward
    divisible = duration / self.Scale
    #add them to the direction
    self.TowardsX += divisible
    self.TowardsY += divisible
    Xs = []
    Ys = []
    for x in xrange(self.X, tempX + divisible):
        #find out if it is a plottable point
        if (((slope * (x - self.X)) + self.Y) % self.Scale == 0.0):
            Xs.append(x)
            Ys.append((int)((slope * (x - self.X)) + self.Y))
    #Plot the points
    for i in xrange(0, len(Xs)):
        for j in xrange(0, len(Ys)):
            if (self.Plot[Xs[i]][Ys[j]] == 0):
                self.Plot[Xs[i]][Ys[j]] = 1
    self.X += divisible
    self.Y += divisible

但是,当我打电话给GoForward(2)时,它会用一个列填充五列,而不是几个点。例如:

[[0,0,0,0,1,1,0,0,0,0]
 [0,0,0,0,1,1,0,0,0,0]
 [0,0,0,0,1,1,0,0,0,0]
 [0,0,0,0,1,1,0,0,0,0]
 [0,0,0,0,1,1,0,0,0,0]
 [0,0,0,0,1,1,0,0,0,0]
 [0,0,0,0,1,1,0,0,0,0]
 [0,0,0,0,1,1,0,0,0,0]
 [0,0,0,0,1,1,0,0,0,0]
 [0,0,0,0,1,1,0,0,0,0]]

基于给GoForward(n)的参数,它创建了许多满0的列......为什么会发生这种行为?我的代码不应该产生这种效果,但我对python缺乏经验,那么为什么会发生这种情况呢?提前致谢

修改

所以我将绘制点的代码更改为

for i in xrange(0, len(Xs)):
    if (self.Plot[Xs[i]][Ys[i]] == 0):
        self.Plot[Xs[i]][Ys[i]] = 1

哪个会有正确的值,但它仍然会产生这种奇怪的行为,问题在于此代码。

编辑2

当我使用代码时:

self.Plot[3][3] = 1

它仍然会生成一个数组:

[[0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]
 [0, 0, 0, 1, 0, 0, 0, 0, 0, 0]]

2 个答案:

答案 0 :(得分:1)

在进行任何修改之前,我会说你应该做一个简单的导入(来自未来导入部门)。对我而言,问题似乎是分裂。在Python 2.7中,它返回一个整数。 看看这个:

>>> 4/3
1
>>> 4//3
1

但是如果您导入新的分区功能......

>>> from __future__ import division
>>> 4/3
1.3333333333333333

答案 1 :(得分:1)

为了生成您正在显示正在打印self.Plot的网格?你说这个网格被初始化为0?究竟是什么self.Plot?列表清单就是这样吗?当您在运行该循环之前打印self.Plot时,它是否打印出您期望的内容(我假设应该全部为零)?

因此,如果XsYs是应该为1的点,则可以使用一个可绘制点列表简化代码:

plottable_points = []
# for loop
    plottable_points.append( (x, int((slope * (x - self.X)) + self.Y)) )

for x, y in plottable_points:
    self.Plot[x][y] = 1

我不确定self.Plot究竟是如何被初始化或使用的,但是如果你在每一步之前和之后打印东西,你应该能够找出逻辑错误的位置。

编辑1: 额外的小蟒蛇提示:

for x, y in zip(Xs, Ys):
    self.Plot[x][y] = 1

与我的第一个代码示例相同,但使用您的变量。

编辑2:

问题实际上与初始化self.Plot的方式有关。当您重复这样的列表时,您的外部列表将成为指针列表...所有指向同一对象(在本例中为列表)。因此,当您说self.Plot[3][3] = 1时,您实际上是在每行中设置该列。尝试使用类似的东西初始化self.Plot(可能有更好的方法来做到这一点,但我很累):

self.Plot = []
for col in range(height * multiplyBy):
    self.Plot.append([0] * width * multiplyBy)

# or:
self.Plot = [ [0] * width * multiply for col in range(height * multiplyBy) ]