在python中将随机整数添加到网格的外部单元格中

时间:2016-02-03 13:25:23

标签: python arrays grid

我有一个游戏网格,如下所示:

grid = [(0,0,0,0,0,0,0),
        (0,0,0,0,0,0,0),
        (0,0,0,0,0,0,0),
        (0,0,0,0,0,0,0),
        (0,0,0,0,0,0,0)]

我需要遍历网格的外部单元格并随机将其转换为“1”或“0”。

有没有办法快速完成这项工作,同时保持改变网格大小的能力并仍然执行相同的操作?

提前感谢!

5 个答案:

答案 0 :(得分:2)

首先,您应该使用列表而不是元组,元组是不可变的,不能更改。

使用列表

创建网格列表
grid = [[0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0],
        [0, 0, 0, 0, 0, 0, 0]]

这应该可以解决问题,尽管其中一个python-gurus可能有更简单的解决方案。

第一版

#go through all the lines
for index, line in enumerate(grid):
    #is the line the first or the last one
    if index == 0 or index == len(grid)-1:
        #randomize all entries
        for i in range(0, len(line)):
            line[i] = randint(0, 1)
    #the line is one in the middle
    else:
        #randomize the first and the last
        line[0] = randint(0, 1)
        line[-1] = randint(0, 1)

在玩了更多的东西后,我可以用列表理解来替换嵌套的for,以使代码更具可读性

第二版

for index, line in enumerate(grid):
    if index == 0 or index == len(grid)-1:
        grid[index] = [randint(0, 1)for x in line]
    else:
        line[0] = randint(0, 1)
        line[-1] = randint(0, 1)

如果有人指出更容易/更易读的方式来做,如果我会很高兴。

答案 1 :(得分:1)

如果您将网格表示为列表列表(而不是tupples列表),则需要迭代外部单元格并进行设置:

grid[x][y] = random.randint(0, 1)

......考虑到“随机翻转”,你的意思是“以50%的概率改变它们”。

答案 2 :(得分:0)

你可以使用numpy,而你根本不需要迭代。

import numpy as np
grid = np.array([(0,0,0,0,0,0,0),
        (0,0,0,0,0,0,0),
        (0,0,0,0,0,0,0),
        (0,0,0,0,0,0,0),
        (0,0,0,0,0,0,0)])
grid[[0,-1]] = np.random.randint(2,size=(2,grid.shape[1])) 
grid[:,[0,-1]] = np.random.randint(2,size=(grid.shape[0],2))

答案 3 :(得分:0)

您应该通过numpy模块使用数组来提高性能,如下所示:

import numpy as np
from random import randint

def random_grid():
    while True:  
        grid = np.array([randint(0, 1) for _ in range(35)]).reshape(5,7)
        yield grid

gen_grids = random_grid()
print gen_grids.next()

答案 4 :(得分:0)

延长Jan的回答

from random import randint
grid = [[0,0,0,0,0],
        [0,0,0,0,0],
        [0,0,0,0,0],
        [0,0,0,0,0],
        [0,0,0,0,0]]

for x, j in enumerate(grid):
    for y, i in enumerate(j):
        grid[x][y] = randint(0,1)
print(grid)

这是一个简单的解决方案,无论大小如何,但如果性能至关重要,那么就去找numpy。