2016-02-03 46 views
1

我有一個遊戲載列如下網格:添加隨機整數網格的外層細胞在python

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

如果這是一個遊戲的網格,你可能應該使用列表列表而不是元組列表,因爲元組是不可變的。 Personnaly,但我可能會定義我自己的類代表董事會。 – DainDwarf

+0

遵循上面的註釋,'不可變'意味着Tuple(由圓括號表示)不能改變。要改變外部細胞,你需要一些可變的東西(就像建議的列表一樣)。 – ATLUS

回答

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)) 
1

如果你代表你的網格,列表的列表(而不是tupples的列表),那麼它的遍歷外層細胞和設定的問題:

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

...考慮通過「隨機打開它們」,你的意思是「以50%的概率改變它們」。

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]] 

這應該做的伎倆名單,雖然蟒蛇-大師之一可能有一種更簡單的解決方案。

第一版

#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 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) 

如果有人指出一個更容易/更可讀的方式來做我我會很高興。

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() 
0

延長一月的回答

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) 

這是一個簡單的解決方案獨立於無論是大小,但如果表現至關重要的,然後去努力。