使用 2D 列表在板上打印形状,生命游戏,家庭作业
Using 2D Lists to Print a Shape on a Board, Game of Life, Homework
在接触二维列表之前,我对概念的掌握非常好,最近我的家庭作业失败了,我不得不使用二维列表简单地再现 "Conway's Game of Life"。我能够使用 for 循环打印电路板和 U 形,但我什至无法开始尝试对 2D 列表执行相同的操作。我只是迷路了,我觉得如果我能找到一个起点,我就可以解决剩下的问题。另一个问题是 "U" 形状是静态的,我用 "randint" 函数尝试了一些不同的东西,但无法让整个 "U" 形状四处移动。
编辑: 添加代码到底部,从 "tempGen" 开始。
我想出了如何使用 2D 列表打印 30 x 60 板,目前我正在尝试弄清楚如何将我的 "U" 形状合并到那里。
#! python3
import random
from random import randint
MAX_ROW = 30
MAX_COL = 60
currentGen = [ [MAX_ROW], [MAX_COL] ]
tempGen = [ [MAX_ROW], [MAX_COL] ]
def displayMenu(): #DISPLAY OUTPUT OPTIONS, DON'T COLLECT
print("[P]lay - Press 'P' to play.\n[Q]uit - Press 'Q' to exit.\n")
def setZeroList(): #INITIALIZE 2-D LISTS TO ZERO
currentGen = [[0], [0]]
tempGen = [[0], [0]]
return currentGen, tempGen
def copyList(): #COPY 2D LIST TO ANOTHER 2D LIST
print("?????")
def displayList(): #PRINTS ANY 2D LIST
print("?????")
def setInitialPatternList(): #CREATE THE "U" SHAPE
for MAX_ROW in range(30):
for MAX_COL in range(60):
if ((MAX_COL == 0 or MAX_COL == 6) and MAX_ROW <= 5) or (MAX_ROW == 5 and (MAX_COL >= 0 and MAX_COL <= 6)):
print("X", end="")
else:
print(end = ".")
print()
tempGen = [["*"]* MAX_COL] * MAX_ROW
print("\ntable:")
for row in range(MAX_ROW):
for col in range(MAX_COL):
if (col == (MAX_COL - 1)):
print(tempGen[row][col], end = "\n")
else:
print(tempGen[row][col], end = "")
让我们从真正的二维列表开始。二维列表只是列表的列表。使用普通列表,您可以执行
my_list[0] = 4
对于二维列表,每个元素都是一个列表-
list_of_lists[4] = ["a","b"]
这里是list_of_list[4][0]
returns"a",因为我们真的是在做(list_of_list[4])[0]
。您可以将 something[i][j]
表示法等同于 Coordinate Plane: 'something', Position: (i, j)
,其中 i
和 j
是 x 和 y 值。
考虑到这一点,让我们考虑制作二维列表。由于二维列表中的每个 "row" 都包含一个列表,因此您需要先用空列表填充原始列表。像
list_of_lists = []
for i in range(depth):
list_of_lists.append([])
这将允许您在 [0,depth) 范围内分配附加到二维列表的任何行。您不能像原来的 post 那样简单地使用 tempGen = [["*"]* MAX_COL] * MAX_ROW
,因为二维列表的每一行都将引用同一个列表,因此更改一行会相同地影响所有行。如果您还想访问每个元素而不附加,请考虑用 [0] * width
或 [None] * width
之类的内容填充原始列表,而不是空列表 []
.
现在假设您构建了一个二维列表,用一些数据填充了它,现在您想要向右移动所有元素。你可以写一个函数来做这个
def right_shift(my_list):
for row_num in range(len(my_list)): # for each list in our list of lists
row = my_list[row_num]
for col_num in range(len(row)-2, -1, -1): # skip the last element, and iterate backwards
row[col_num + 1] = row[col_num] # assign the (col_num+1)th element to equal the col_num 'th element in that row.
return my_list
只需编写处理一行的逻辑,然后将该逻辑扩展到列表列表的所有其他行(通常只使用一个 for 循环)。
为了更好的衡量,让我们覆盖打印二维数组-
def print_matrix(list_of_lists):
for row in list_of_lists:
print("".join(map(str, row))) # here map(str,...) is used to make sure every element is a string.
熟悉二维列表后,您可能需要考虑查看字典。您可以通过使用元组作为键来避免嵌套列表,例如 my_dict[(14, 27)] = "A"
,或者甚至使用 defaultdict 来避免用空的 list/dict 填充每个条目 - from collections import defaultdict; my_2D_dict = defaultdict(dict)
,然后可以直接使用my_2D_dict[4][2] = "something"
.
在接触二维列表之前,我对概念的掌握非常好,最近我的家庭作业失败了,我不得不使用二维列表简单地再现 "Conway's Game of Life"。我能够使用 for 循环打印电路板和 U 形,但我什至无法开始尝试对 2D 列表执行相同的操作。我只是迷路了,我觉得如果我能找到一个起点,我就可以解决剩下的问题。另一个问题是 "U" 形状是静态的,我用 "randint" 函数尝试了一些不同的东西,但无法让整个 "U" 形状四处移动。
编辑: 添加代码到底部,从 "tempGen" 开始。
我想出了如何使用 2D 列表打印 30 x 60 板,目前我正在尝试弄清楚如何将我的 "U" 形状合并到那里。
#! python3
import random
from random import randint
MAX_ROW = 30
MAX_COL = 60
currentGen = [ [MAX_ROW], [MAX_COL] ]
tempGen = [ [MAX_ROW], [MAX_COL] ]
def displayMenu(): #DISPLAY OUTPUT OPTIONS, DON'T COLLECT
print("[P]lay - Press 'P' to play.\n[Q]uit - Press 'Q' to exit.\n")
def setZeroList(): #INITIALIZE 2-D LISTS TO ZERO
currentGen = [[0], [0]]
tempGen = [[0], [0]]
return currentGen, tempGen
def copyList(): #COPY 2D LIST TO ANOTHER 2D LIST
print("?????")
def displayList(): #PRINTS ANY 2D LIST
print("?????")
def setInitialPatternList(): #CREATE THE "U" SHAPE
for MAX_ROW in range(30):
for MAX_COL in range(60):
if ((MAX_COL == 0 or MAX_COL == 6) and MAX_ROW <= 5) or (MAX_ROW == 5 and (MAX_COL >= 0 and MAX_COL <= 6)):
print("X", end="")
else:
print(end = ".")
print()
tempGen = [["*"]* MAX_COL] * MAX_ROW
print("\ntable:")
for row in range(MAX_ROW):
for col in range(MAX_COL):
if (col == (MAX_COL - 1)):
print(tempGen[row][col], end = "\n")
else:
print(tempGen[row][col], end = "")
让我们从真正的二维列表开始。二维列表只是列表的列表。使用普通列表,您可以执行
my_list[0] = 4
对于二维列表,每个元素都是一个列表-
list_of_lists[4] = ["a","b"]
这里是list_of_list[4][0]
returns"a",因为我们真的是在做(list_of_list[4])[0]
。您可以将 something[i][j]
表示法等同于 Coordinate Plane: 'something', Position: (i, j)
,其中 i
和 j
是 x 和 y 值。
考虑到这一点,让我们考虑制作二维列表。由于二维列表中的每个 "row" 都包含一个列表,因此您需要先用空列表填充原始列表。像
list_of_lists = []
for i in range(depth):
list_of_lists.append([])
这将允许您在 [0,depth) 范围内分配附加到二维列表的任何行。您不能像原来的 post 那样简单地使用 tempGen = [["*"]* MAX_COL] * MAX_ROW
,因为二维列表的每一行都将引用同一个列表,因此更改一行会相同地影响所有行。如果您还想访问每个元素而不附加,请考虑用 [0] * width
或 [None] * width
之类的内容填充原始列表,而不是空列表 []
.
现在假设您构建了一个二维列表,用一些数据填充了它,现在您想要向右移动所有元素。你可以写一个函数来做这个
def right_shift(my_list):
for row_num in range(len(my_list)): # for each list in our list of lists
row = my_list[row_num]
for col_num in range(len(row)-2, -1, -1): # skip the last element, and iterate backwards
row[col_num + 1] = row[col_num] # assign the (col_num+1)th element to equal the col_num 'th element in that row.
return my_list
只需编写处理一行的逻辑,然后将该逻辑扩展到列表列表的所有其他行(通常只使用一个 for 循环)。
为了更好的衡量,让我们覆盖打印二维数组-
def print_matrix(list_of_lists):
for row in list_of_lists:
print("".join(map(str, row))) # here map(str,...) is used to make sure every element is a string.
熟悉二维列表后,您可能需要考虑查看字典。您可以通过使用元组作为键来避免嵌套列表,例如 my_dict[(14, 27)] = "A"
,或者甚至使用 defaultdict 来避免用空的 list/dict 填充每个条目 - from collections import defaultdict; my_2D_dict = defaultdict(dict)
,然后可以直接使用my_2D_dict[4][2] = "something"
.