【发布时间】:2017-11-28 15:24:41
【问题描述】:
我想使用 zip() 方法在 Python 中提取二维数组的一个非常特定的部分(并避免循环逻辑混乱)。我想使用 zip 来实现这样的目标:
>>> sub_matrix = list(zip([*grid[0:3]]*3))
# Desired output example (Option 1)
[".","4",".", ".",".","4",".",".","."]
# Desired output example (Option 2)
[[".","4","."],
[".",".","4"],
[".",".","."]]
我正在 Python 中使用下面的二维数组来解决面试练习问题。
grid = [[".","4",".",".",".",".",".",".","."],
[".",".","4",".",".",".",".",".","."],
[".",".",".","1",".",".","7",".","."],
[".",".",".",".",".",".",".",".","."],
[".",".",".","3",".",".",".","6","."],
[".",".",".",".",".","6",".","9","."],
[".",".",".",".","1",".",".",".","."],
[".",".",".",".",".",".","2",".","."],
[".",".",".","8",".",".",".",".","."]]
解决该问题的一部分包括确保数独游戏中的每个 3 x 3“区域”都包含合法值。我想使用zip() 快速提取矩阵的 3 x 3 部分。例如,左上角的区域会导致测试失败,因为它包含 4 两次。
我知道我可以对网格进行子集化以获得前三行,如下所示:
>>> sub_grid = grid[0:3]
>>> print(sub_grid)
[['.', '4', '.', '.', '.', '.', '.', '.', '.'],
['.', '.', '4', '.', '.', '.', '.', '.', '.'],
['.', '.', '.', '1', '.', '.', '7', '.', '.']]
我稍微修改了打印以使其更明显,但在这一点上,我想使用 3 的“步长”压缩三个数组,这样每个新数组都会从之前的每个数组中压缩 3 个值继续下一个。
在Python3 docs on zip 中有一段我认为可以做到这一点的摘录,但我无法获得所需的输出。
保证迭代的从左到右的评估顺序。 这使得将数据系列聚类为 使用
zip(*[iter(s)]*n)的 n 长度组。
(对于后代,问题来自 CodeFights will be hidden until unlocked)
非常感谢任何帮助。谢谢。
【问题讨论】:
-
在 numpy 中,这将是
grid[0:3, 0:3]。
标签: python matrix multidimensional-array iterator