如何在 python 矩阵中设置单元格?
How can I set a cell in python matrix?
这是我的问题:
self.gameField = [
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
]
如您所见,我使用列表创建了一个矩阵,我需要更改用户编辑的列的单个元素 select,所以我尝试使用以下代码:
for z in self.gameField:
if z[num] == "-":
z[num] = "X"
print "Done"
其中'num'为0到6的整数,表示子列表。我想 select 列,并设置最低的 '-' 可用(就像有重力一样),例如,如果我 select '0'
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['X', '-', '-', '-', '-', '-', '-']
但实际上我的程序改变了所有列的值
['X', '-', '-', '-', '-', '-', '-']
['X', '-', '-', '-', '-', '-', '-']
['X', '-', '-', '-', '-', '-', '-']
['X', '-', '-', '-', '-', '-', '-']
['X', '-', '-', '-', '-', '-', '-']
['X', '-', '-', '-', '-', '-', '-']
我该如何解决?你有什么想法吗?
将之前的评论放在一起:
假设您的网格创建良好(参见多个子列表引用可能存在的问题 - 基本上如果您使用类似 self.gameField = [[['_']*7]*6]
的内容创建网格, 似乎 很短并且干净,在你的情况下它实际上很糟糕),你只需要在你放置 "X"
后立即跳出 for
循环(否则你只会继续填充整个列!):
for z in self.gameField:
if z[num] == "-":
z[num] = "X"
print "Done"
break
请注意,您可能希望以相反的顺序迭代行(您的 for
循环),以便在打印网格时重力向下(或反向打印网格)...
首先在lists
中定义lists
,还需要将lists
和,
分开。所以下面。
[['-','-']['-', '-']]
会变成。
[['-','-'],['-', '-']]
其次,您可以通过这种方式访问 list
索引,而不是遍历 lists
。
gameField[3][3] = 'X'
如果考虑算法因素,此访问的运行时间为 1,现在不相关。但扩大规模可能会成为一个问题。综上所述,我创建了以下 运行 代码。
gameField = [['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-']]
gameField[3][3] = 'X'
print(gameField)
这是我的问题:
self.gameField = [
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
]
如您所见,我使用列表创建了一个矩阵,我需要更改用户编辑的列的单个元素 select,所以我尝试使用以下代码:
for z in self.gameField:
if z[num] == "-":
z[num] = "X"
print "Done"
其中'num'为0到6的整数,表示子列表。我想 select 列,并设置最低的 '-' 可用(就像有重力一样),例如,如果我 select '0'
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['-', '-', '-', '-', '-', '-', '-']
['X', '-', '-', '-', '-', '-', '-']
但实际上我的程序改变了所有列的值
['X', '-', '-', '-', '-', '-', '-']
['X', '-', '-', '-', '-', '-', '-']
['X', '-', '-', '-', '-', '-', '-']
['X', '-', '-', '-', '-', '-', '-']
['X', '-', '-', '-', '-', '-', '-']
['X', '-', '-', '-', '-', '-', '-']
我该如何解决?你有什么想法吗?
将之前的评论放在一起:
假设您的网格创建良好(参见多个子列表引用可能存在的问题 - 基本上如果您使用类似 self.gameField = [[['_']*7]*6]
的内容创建网格, 似乎 很短并且干净,在你的情况下它实际上很糟糕),你只需要在你放置 "X"
后立即跳出 for
循环(否则你只会继续填充整个列!):
for z in self.gameField:
if z[num] == "-":
z[num] = "X"
print "Done"
break
请注意,您可能希望以相反的顺序迭代行(您的 for
循环),以便在打印网格时重力向下(或反向打印网格)...
首先在lists
中定义lists
,还需要将lists
和,
分开。所以下面。
[['-','-']['-', '-']]
会变成。
[['-','-'],['-', '-']]
其次,您可以通过这种方式访问 list
索引,而不是遍历 lists
。
gameField[3][3] = 'X'
如果考虑算法因素,此访问的运行时间为 1,现在不相关。但扩大规模可能会成为一个问题。综上所述,我创建了以下 运行 代码。
gameField = [['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-'],['-', '-', '-', '-', '-', '-', '-']]
gameField[3][3] = 'X'
print(gameField)