【发布时间】:2012-05-20 11:56:02
【问题描述】:
我有一个像这样的元组列表
a = [(1, 2), (2, 2), (3, 2)]
此列表的长度会有所不同。顺序也可以颠倒,例如:
a = [(3, 2), (2, 2), (1, 2)]
我还有一个列表,例如:
b = [['0', '0', '0'], ['0', '0', '0'], ['0', '0', '0'], ['0', '0', '0']]
现在我想遍历这个列表并修改具有索引的项目:
b[3][2]
b[2][2]
b[1][2]
所以索引取决于 a。我试过这个:
for item in indexes_list:
b[item[0]][item[1]] = '1'
但这为我修改了整个最后一列(我只想用 a 中给出的索引修改最后一列的最后 3 项)。实现这一目标的最佳方法是什么?
编辑: 感谢您的回复,但他们没有为我工作。我都试过了,同样的事情发生了。我也在 index_list 上犯了这个错误(这是一个错字),因为我试图简化问题。我应该进一步阐述。
列表列表用于某种井字游戏。我必须测试用户输入的移动是否将对手的棋子夹在中间。它不必是 3x3 棋盘,因此可以进行长移动,以便将多个对手棋子夹在中间。如果移动确实夹住对手棋子,则对手棋子被抹去,由用户棋子替换。
当我尝试这两种方法时,它会在第一次遍历 for 循环后快速为整个列执行此操作(通过设置断点和调试,已检测到这一点)。这是我编的代码:
for i, j in (indexes[0])[:len(y_p.rstrip('.'))]:
print item
board[i][j] = user
print board
我使用 print 语句来查看调试时会发生什么。 User 是一个变量,它保存用户片段的 str 值。 rstrip 方法用于检测移动到的位置。
默认情况下,板是:
[['.', '.', '.', '.', '.'], ['.', 'X', 'O', '.', '.'], ['.', 'O', 'X', '.', '.'], ['.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.']]
y_p 打印
'.OX.' # board[3][1] + board[2][1] + board[1][1] + board[0][1]
indexes[0] 打印
[(3, 1), (2, 1), (1, 1), (0, 1)]
但我只想这样做
[(3, 1), (2, 1), (1, 1)]
因为 board[0][1] 坐标定义了一个空白区域(无效)。此列表中的第一个坐标板[3][1] 是用户想要移动的位置。 board[2][1] 是对手棋子,board[1][1] 是用户棋子。因此它应该转动由坐标定义的碎片
[(3, 1), (2, 1), (1, 1)]
到用户的一块。但它是为这些坐标做的(注意这是一个 5x5 板)
[(4,1), (3, 1), (2, 1), (1, 1)]
所以即使 board[4][1] 不在初始索引列表中,它也会被修改。执行后,板子变成:
[['.', 'X', '.', '.', '.'], ['.', 'X', 'O', '.', '.'], ['.', 'O', 'X', '.', '.'], ['.', 'X', '.', '.', '.'], ['.', 'X', '.', '.', '.']]
这是不对的(第一行和最后一行的“X”不应该在那里)
【问题讨论】:
-
“因为 board[0][1] 坐标定义了一个空白区域(无效)。”你知道python列表是从0开始索引的吗?索引 0 不是无效的。无效是什么意思?
-
顺便说一句,您似乎在描述黑白棋的规则。在您的问题中提及该游戏的名称可能是一个好主意,以便了解该游戏的人可以立即理解您的问题,而无需阅读您试图解释它的长文本。您也可以使用搜索引擎找到一个页面,该页面用图表解释规则并链接到该页面。如果有图表,它会更容易理解你想要做什么。
-
我的意思是在游戏中无效