在给定索引元组的情况下循环遍历列表的列表

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'

但这会修改整个最后一列(我只想修改最后一列中给定索引的最后3个项目)。有什么最好的方法可以实现这一点吗?
编辑: 感谢回复,但它们对我没有起作用。我已经尝试了两种方法,但结果都是一样的。我也在indexes_list上犯了一个错误(这是一个笔误),因为我试图简化问题。我应该进一步阐述。
列表的列表是某种井字棋板。我必须测试用户输入的移动是否夹住了对手的棋子。它不必是一个3x3的棋盘,因此长距离的移动是可能的,以便可以夹住多个对手棋子。如果移动确实夹住了对手的棋子,则对手的棋子将被消除,以被用户的棋子取代。
当我尝试这两种方法时,它很快就会在第一次遍历循环后为整个列执行操作(通过设置断点和调试来检测到这一点)。以下是我的程序代码:
    for i, j in (indexes[0])[:len(y_p.rstrip('.'))]:
            print item
            board[i][j] = user
            print board

我使用了print语句来调试代码。User是一个变量,它保存用户输入的字符串值。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]坐标定义了一个空白处(无效)。该列表中的第一个坐标board [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]不在初始索引列表中,它也会被修改。执行后,board变成:

[['.', 'X', '.', '.', '.'], ['.', 'X', 'O', '.', '.'], ['.', 'O', 'X', '.', '.'], ['.', 'X', '.', '.', '.'], ['.', 'X', '.', '.', '.']]

这不是正确的(第一行和最后一行的“X”不应该出现)


你知道Python列表是从0开始索引的吗?索引0并不是无效的。你所说的无效是什么意思?因为board[0][1]坐标定义了一个空格(无效)。 - Mark Byers
顺便说一下,您似乎在描述奥赛罗/翻转棋的规则。在您的问题中提到该游戏的名称可能是个好主意,这样了解该游戏的人就可以立即理解您的问题,而不必阅读您试图解释的长篇文字。此外,您可以使用搜索引擎找到一个带有图表解释规则的页面,并链接到该页面。如果有图表,将更容易理解您试图做什么。 - Mark Byers
我所说的“无效”是指游戏情况。 - user1397215
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!!!

3
值得一提的是,你可以这样做:b = [[0, 0, 0] for _ in range(4)] - lvc

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

1
使用for循环来拆分元组,而不是依赖于丑陋的索引,这样做非常棒! - Matthew Trevor

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接