4

我有一个像这样的元组列表

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]

索引[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”不应该在那里)

4

2 回答 2

7

一个问题是您的索引列表被调用a,但您引用的是indexes_list.

修复此错误,它可以工作:(ideone)

indexes_list = [(3, 2), (2, 2), (1, 2)]
b = [['0', '0', '0'], ['0', '0', '0'], ['0', '0', '0'], ['0', '0', '0']]

for item in indexes_list:
    b[item[0]][item[1]] = '1'

print b

结果:

[['0', '0', '0'], ['0', '0', '1'], ['0', '0', '1'], ['0', '0', '1']]

注意:在你说“但我试过了,它对我不起作用”之前,请仔细阅读代码并特别注意是如何b构造的。以下非常相似的替代方法不起作用,因为它们创建了一个包含对同一列表的 4 个引用的列表。

错误的做法:(ideone)

bb = ['0', '0', '0']
b = [bb, bb, bb, bb]          # Wrong!!!

另一种错误的做法:(ideone)

b = [['0', '0', '0']] * 4     # Wrong!!!
于 2012-05-20T11:59:12.337 回答
3
a = [(1, 2), (2, 2), (3, 2)]
b = [['0', '0', '0'], ['0', '0', '0'], ['0', '0', '0'], ['0', '0', '0']]
for i, j in a:
    b[i][j] = '1'

print b
[['0', '0', '0'], ['0', '0', '1'], ['0', '0', '1'], ['0', '0', '1']]
于 2012-05-20T12:00:12.453 回答