我有一个游戏网格,如下所示:
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”。
有没有办法快速完成这项工作,同时保持改变网格大小的能力并仍然执行相同的操作?
提前感谢!
答案 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。