如何环绕列表的开头/结尾?

时间:2012-12-06 12:48:01

标签: python list

我有一个2d阵列,每个阵列都有不同的物种。我在数组上选择一个随机元素,我想要计算紧邻该元素的八个方块中每个物种的数量。

但是我希望数组在边缘处包裹,所以如果我在顶行选择一个元素,则底行将被计为“相邻”。如何在迭代j in range (x-1,x+1)和j和y相同的情况下执行此操作?

此外,是否有更优雅的方法省略我最初选择的元素,同时查看相邻的正方形而不是if (j!=x or k!=y线?

numspec = [0] * len(allspec)
for i in range (0,len(allspec)):
    #count up how many of species i there is in the immediate area
    for j in range(x-1,x+1):
        for k in range(y-1,y+1):
            if (j!=x or k!=y):
                numspec[hab[i][j]] = numspec[hab[i][j]]+1

3 个答案:

答案 0 :(得分:1)

您可以使用j%8换行,从而为您提供0到7之间的数字。

答案 1 :(得分:1)

至于包装,我建议使用从-1到+1的相对索引,然后使用模运算符(%)计算实际索引。

至于确保你不计算原始元素(x,y),你做的很好(我可能会使用反转的连续并继续,但没关系)。

我不太了解你对i, j, k索引的使用,所以我只假设i是物种的索引,j, k是2d地图的索引hab {1}}我将其更改为x_rely_relx_idx以及y_idx,以使其更具可读性。如果我弄错了,请更改密码或告诉我。

我也冒昧地做了一些小修理:

  • 引入代表物种数的N常数
  • range更改为xrange(xrange更快,占用内存更少等)
  • 无需在范围(或xrange)中指定0
  • 代替X = X + 1以增加价值,我使用+=增量运算符,如下所示:X += 1

以下是结果代码:

N = len(allspec)
numspec = [0] * N
for i in xrange(N):
    for x_rel in xrange(-1, +1):
        for y_rel in xrange(-1, +1):
            x_idx = (x + xrel) % N
            y_idx = (y + yrel) % N
            if x_idx != x or y_idx != y:
                numspec[hab[x_idx][y_idx]] += 1

答案 2 :(得分:0)

您可以构建相邻元素的列表并从那里开始。例如,如果您的2d列表被称为my_array并且您想要检查紧邻my_array[x][y]周围的块,那么您可以执行以下操作:

xmax = len(my_array)
ymax = len(my_array[0])  #assuming it's a square...

x_vals = [i%xmax for i in [x-1,x,x+1]]
y_vals = [blah]

surrounding_blocks = [ 
     my_array[x_vals[0]][y_vals[0]],
     my_array[x_vals[0]][y_vals[1]],
     my_array[x_vals[0]][y_vals[2]],
     my_array[x_vals[2]][y_vals[0]],
     my_array[x_vals[2]][y_vals[1]],
     my_array[x_vals[2]][y_vals[2]],
     my_array[x_vals[1]][y_vals[0]],
     my_array[x_vals[1]][y_vals[2]],
        ]