【问题标题】:Loop over list of lists given list of indices in tuple form以元组形式循环给定索引列表的列表列表
【发布时间】: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 不是无效的。无效是什么意思?
  • 顺便说一句,您似乎在描述黑白棋的规则。在您的问题中提及该游戏的名称可能是一个好主意,以便了解该游戏的人可以立即理解您的问题,而无需阅读您试图解释它的长文本。您也可以使用搜索引擎找到一个页面,该页面用图表解释规则并链接到该页面。如果有图表,它会更容易理解你想要做什么。
  • 我的意思是在游戏中无效

标签: python list tuples


【解决方案1】:

一个问题是您的索引列表称为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!!!

【讨论】:

  • 值得一提的是,您可以做到b = [[0, 0, 0] for _ in range(4)]
【解决方案2】:
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 循环来拆分元组,而不是依赖丑陋的索引 :)
猜你喜欢
  • 2017-09-07
  • 2021-12-01
  • 2022-01-24
  • 2014-05-02
  • 2013-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多