2014-03-04 36 views
4

我想创建初始设置为0Pythonic创建2d数组的方法?

这是我会怎样想做到这一点整数值的二维数组:

grid = [[0] * width] * height 

但是,这仅仅是创建每一行作为参考的原始资料,所以做类似

grid[0][1] = 1 

将修改所有grid [n] [1]值。

这是我的解决方案:

grid = [[0 for x in range(width)] for y in range(height)] 

感觉不对,有没有更好的更Python的方式来做到这一点?

编辑: 奖金的问题,如果网格大小永远不会改变,只会包含整数,我应该使用像tuple或array.array而不是?

回答

4

Since numbers are immutable, using * to create a list should be fine。因此,二维列表初始化可以这样

[[0] * width for y in range(height)] 
+0

为什么不:'[0] *宽* height' – zeffii

+1

@zeffii这将只创建一个列表'[0] *宽]'(认为这是'l1'),并创建一个列表其中'height'元素中的所有元素都是对'l1'的引用。所以,更改任何列表也会反映在所有其他列表中。 – thefourtheye

+0

优秀,谢谢! – zeffii

1

来完成,您可以使用numpy.zeros

import numpy as np 
numpy.zeros(height, width) 

如果它是作为选件dtype=numpy.int8

+0

是的,我以前用numpy做过,但我试图避免当前项目的外部依赖关系。 – Igglyboo

0

整数这里使用的是我用什么。

def generate_board(n): #Randomly creates a list with n lists in it, and n random numbers 
         #in each mini list 
    list = [] 
    for i in range(0, n): 
     list.append([]) 
     for j in range(0, n): 
      list[i].append(random.randint(0, 9)) 
    return list 

def print_board(board): 
    n = len(board) - 1 
    while n > -1: 
     print str(board[n]) + ' = ' + str(n) 
     n -= 1