python - 在 Python 的 for 循环中使用 range(len(x)) 时添加索引有什么影响?例如范围(len(x [0])
问题描述
我对编码很陌生,并且正在使用 Python。在在线课程中,我正在创建一个极小极大函数来尝试对 AI 进行编程以玩 Connect 4。以下代码构成了评估函数,以计算玩家“X”和玩家“O”是否有任何“两条条纹”(在现在一个方向)通过计算,给定棋盘上的位置,其右侧列中的棋子是否具有相同的符号。
def my_evaluate_board(board):
if has_won(board, "X"):
return float("Inf")
elif has_won(board, "O"):
return -float("Inf")
else:
x_two_streak = 0
o_two_streak = 0
for col in range(len(board)-1):
for row in range(len(board[0])):
if board[col][row] == "X" and board[col + 1][row] == "X":
x_two_streak += 1
for col in range(len(board)-1):
for row in range(len(board[0])):
if board[col][row] == "O" and board[col + 1][row] == "O":
o_two_streak += 1
return x_two_streak - o_two_streak
我明白在 for 循环中:
for col in range(len(board)-1):
-1 就位是因为代码正在寻找每列的右侧以连续查找两个部分,这可以防止循环尝试查找最后一列的右侧。
我不明白为什么在下一行代码中添加索引正在做它正在做的事情:
for row in range(len(board[0])):
在我的脚本的其他地方,我打印了这一行的输出,有无索引,但无论我放什么索引,我都会得到相同的结果。该板有 7 列,每列有 6 行。见下文:
print(range(len(new_board[0])))
# this returns: range(0, 6)
print(range(len(new_board)))
# this prints: range(0, 7)
并证明我对指数价值没有任何影响的意思:
print(range(len(new_board[4])))
# this prints: range(0, 6)
我想这样做的目的是将函数循环遍历行的次数减少 1,因为行比列少 1。
请有人解释为什么在 for 循环中添加索引会使函数以这种方式运行?
解决方案
看起来您的数据被组织为一个矩阵,在这种情况下,它被实现为一个列表列表。这意味着 board 的每个元素都是代表一列的列表。列的长度表示矩阵的行数。每列将具有相同的长度,因此您可以选择其中任何一个来查找行数。最佳选择是第一列(索引为 [0] 的列)。
为了更清楚,你可以使用
n_cols = len(board)
n_rows = len(board[0])
并将你的循环重写为
for row_index in range(n_rows):
for column_index in range(n_cols):
尝试更好地理解这种结构,您可以创建自己的样本矩阵
l = [[1, 2, 3], [4, 5, 6]]
因此您创建了一个形状为 2x3 的矩阵
print(len(l))
将返回 2,而
print(l[0])
print(l[1])
将返回 [1 ,2, 3] 和 [3, 4, 5]。它们中的每一个都有长度 3(所以print(len(l[0])
或print(len(l[1])
都将返回 3)。可视化矩阵的更好方法是将其转换为 numpy 数组
import numpy
print(numpy.array(l))
将以更熟悉的形状向您展示矩阵
[[1 2 3]
[2 3 4]]
推荐阅读
- javascript - 如何将我的模拟猫鼬保存功能挂钩到我要测试的功能中?
- html - 溢出隐藏的div
- ide - Anaconda Spyder Auto Complete 确实有效,但没有显示可能的解决方案
- unix - 父进程可以更改其子进程的pid吗?
- openrefine - 如何在 Openrefine 中使用带数值的交叉函数
- ios - 未设置的委托正在崩溃
- github - 每次提交后的 github API 代码存储库状态
- javascript - Ember.RSVP.Promise 中的 AJAX 调用
- react-native - react-native run-android 错误
- ios - 关于没有`removeObserver:forKeyPath:`的iOS10和iOS11中KVO的不同行为