希望遍历跳过特定索引的列表列表

Looking to iterate through list of lists that skips over specific indices

我目前正在开展一个 Python 3 项目,该项目涉及多次遍历列表列表,我想编写一个代码来跳过此列表列表的特定索引。具体索引存储在单独的列表列表中。我写了一小部分列表,grid 和我不想迭代的值,coordinates:

grid = [[0, 0, 1], [0, 1, 0], [1, 0, 0]]
coordinates = [[0, 2], [1, 1], [2, 0]]

基本上,我希望跳过grid中的每个1(1只是用来使相应的坐标位置更明显)。

我尝试了以下代码无济于事:

for row in grid:
    for value in row:
        for coordinate in coordinates:
            if coordinate[0] != grid.index(row) and coordinate[1] != row.index(value):
                row[value] += 4
   
print(grid)

预期输出为:[[4, 4, 1], [4, 1, 4], [1, 4, 4]]

执行代码后,我收到 ValueError: 1 is not in list

我有两个问题:

  1. coordinates 中的每个 coordinate 包含第 0 个和第 1 个位置时,为什么我会收到此错误消息?

  2. 有没有比使用for循环更好的方法来解决这个问题?

您的代码有两个问题。

  1. row 包含整数列表,value 包含这些行中的值。问题是您需要访问这些值的 indices,而不是值本身。您设置循环的方式不允许这样做。

  2. .index() returns传入参数的第一个实例的索引;它不是使用带括号的索引的直接替代品。

这是一个代码片段,它可以执行您所描述的操作,解决了上述两个问题:

grid = [[0, 0, 1], [0, 1, 0], [1, 0, 0]]
coordinates = [[0, 2], [1, 1], [2, 0]]
for row in range(len(grid)):
    for col in range(len(grid[row])):
        if [row, col] not in coordinates:
            grid[row][col] += 4
   
print(grid)  # -> [[4, 4, 1], [4, 1, 4], [1, 4, 4]]

顺便说一下,如果你有很多坐标,你可以把它变成 set 元组而不是二维列表,这样你就不必为每一行遍历整个列表/列索引对。该集合看起来像 coordinates = {(0, 2), (1, 1), (2, 0)},如果您使用的是集合,您将使用 if (row, col) not in coordinates: 而不是 if [row, col] not in coordinates:

grid = [
    [0, 0, 1],
    [0, 1, 0],
    [1, 0, 0]]
coordinates = [[0, 2], [1, 1], [2, 0]]

for y, row in enumerate(grid):
    for x, value in enumerate(row):
        if [x, y] in coordinates or value != 1:
            grid[y][x] += 4
   
print(grid)

这里有一个 numpy 的方法来做到这一点,对于任何正在寻找的人来说 -

import numpy as np

g = np.array(grid)
c = np.array(coordinates)

mask = np.ones(g.shape, bool)
mask[tuple(c.T)] = False

#This mask skips each coordinate in the list
g[mask]+=4

print(g)
[[4 4 1]
 [4 1 4]
 [1 4 4]]

以及单行列表理解,对于那些喜欢它的人 -

[[j+4 if [row,col] not in coordinates else j for col,j in enumerate(i)] for row,i in enumerate(grid)]
[[4, 4, 1], [4, 1, 4], [1, 4, 4]]