希望遍历跳过特定索引的列表列表
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
。
我有两个问题:
当 coordinates
中的每个 coordinate
包含第 0 个和第 1 个位置时,为什么我会收到此错误消息?
有没有比使用for循环更好的方法来解决这个问题?
您的代码有两个问题。
row
包含整数列表,value
包含这些行中的值。问题是您需要访问这些值的 indices,而不是值本身。您设置循环的方式不允许这样做。
.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]]
我目前正在开展一个 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
。
我有两个问题:
当
coordinates
中的每个coordinate
包含第 0 个和第 1 个位置时,为什么我会收到此错误消息?有没有比使用for循环更好的方法来解决这个问题?
您的代码有两个问题。
row
包含整数列表,value
包含这些行中的值。问题是您需要访问这些值的 indices,而不是值本身。您设置循环的方式不允许这样做。.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]]