循环列表列表给出元组形式的索引列表

use*_*215 4 python tuples list

我有一个像元组的列表

a = [(1, 2), (2, 2), (3, 2)]
Run Code Online (Sandbox Code Playgroud)

这个清单的长度会有所不同.订单也可以反转,例如:

a = [(3, 2), (2, 2), (1, 2)]
Run Code Online (Sandbox Code Playgroud)

我还有一个列表列表,如:

b = [['0', '0', '0'], ['0', '0', '0'], ['0', '0', '0'], ['0', '0', '0']]
Run Code Online (Sandbox Code Playgroud)

现在我想遍历这个列表列表并修改具有索引的项目:

b[3][2]
b[2][2]
b[1][2]
Run Code Online (Sandbox Code Playgroud)

所以索引依赖于a.我试过这个:

for item in indexes_list:
    b[item[0]][item[1]] = '1'
Run Code Online (Sandbox Code Playgroud)

但这会为我修改整个最后一列(我只想用a中给出的索引修改最后一列的最后3个项目).完成此任务的最佳方法是什么?

编辑:感谢您的回复,但他们没有为我工作.我试过两个,同样的事情发生了.我也在indices_list上犯了这个错误(这是一个错字),因为我试图简化问题.我应该进一步阐述.

列表列表适用于某种类型的tic tac toe board.我必须测试用户输入的动作是否将对手的棋子夹在中间.它不一定是3x3板,因此可以进行长距离移动,以便可以夹住多个对手棋子.如果移动确实夹住了对手棋子,则对手棋子被删除,由用户棋子取代.

当我尝试这两种方法时,它会在第一次超过for循环后快速完成整个列的操作(通过设置断点和调试,检测到这一点).这是我的编程代码:

    for i, j in (indexes[0])[:len(y_p.rstrip('.'))]:
            print item
            board[i][j] = user
            print board
Run Code Online (Sandbox Code Playgroud)

我使用print语句来查看调试时会发生什么.User是一个包含用户块的str值的变量.rstrip方法用于检测移动应该到达的位置.

默认情况下,主板是:

[['.', '.', '.', '.', '.'], ['.', 'X', 'O', '.', '.'], ['.', 'O', 'X', '.', '.'], ['.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.']]
Run Code Online (Sandbox Code Playgroud)

y_p打印

'.OX.' # board[3][1] + board[2][1] + board[1][1] + board[0][1]
Run Code Online (Sandbox Code Playgroud)

索引[0]打印

[(3, 1), (2, 1), (1, 1), (0, 1)]
Run Code Online (Sandbox Code Playgroud)

但我只想这样做

[(3, 1), (2, 1), (1, 1)]
Run Code Online (Sandbox Code Playgroud)

因为board [0] [1]坐标定义了一个空格(无效).坐标板[3] [1]是此列表中的第一个,是用户想要移动的位置.棋盘[2] [1]是对手棋盘[1] [1]是用户棋子.因此它应该转动由坐标定义的碎片

[(3, 1), (2, 1), (1, 1)]
Run Code Online (Sandbox Code Playgroud)

对用户的作品.但它改为这些坐标(注意这是一个5x5板)

[(4,1), (3, 1), (2, 1), (1, 1)]
Run Code Online (Sandbox Code Playgroud)

所以即使它不在初始索引列表中,甚至板[4] [1]也会被修改.执行后,董事会成为:

[['.', 'X', '.', '.', '.'], ['.', 'X', 'O', '.', '.'], ['.', 'O', 'X', '.', '.'], ['.', 'X', '.', '.', '.'], ['.', 'X', '.', '.', '.']]
Run Code Online (Sandbox Code Playgroud)

哪个不对(第一行和最后一行的'X'不应该在那里)

Mar*_*ers 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
Run Code Online (Sandbox Code Playgroud)

结果:

[['0', '0', '0'], ['0', '0', '1'], ['0', '0', '1'], ['0', '0', '1']]
Run Code Online (Sandbox Code Playgroud)

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

错误的方法:( ideone)

bb = ['0', '0', '0']
b = [bb, bb, bb, bb]          # Wrong!!!
Run Code Online (Sandbox Code Playgroud)

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

b = [['0', '0', '0']] * 4     # Wrong!!!
Run Code Online (Sandbox Code Playgroud)

  • 值得一提的是你*可以*为范围(4)中的_做'b = [[0,0,0]]. (3认同)