我正在使用for循环遍历多维Python列表。该列表代表一个板,我正在寻找占用空间。每个游戏块总有不止一个空间,每个空间用一个整数表示。
我想使用该整数作为键,然后将各个列表中的占用坐标存储为字典的值。最后,第三个值将存储在表示其状态的每个坐标中:(x, y, state)
。
例如,
board = [
[0, 0, 1],
[0, 0, 1],
[0, 2, 0],
[0, 2, 0],
]
ships = {}
这是我的代码:
for row in board:
for column in row:
if column != 0:
if column not in ships:
ships[column] = [[row.index(column), board.index(row), 0]]
else:
ships[column].append([row.index(column), board.index(row), 0])
我不确定为什么它会两次添加相同的坐标。如果它在每行和每列中线性循环,则永远不应再遇到该坐标。
答案 0 :(得分:2)
您的问题是使用index()
方法。当您撰写row.index(column)
,it returns you the index for the first column it finds that is equal to the one you gave it时。
因此,问题出现在您拥有等效的行(示例的第一行和第二行,[0, 0, 1]
和[0, 0, 1]
。
我建议您使用enumerate()
built-in function来检索索引。
for row_index, row in enumerate(board):
for column_index, column in enumerate(row):
if column != 0:
if column not in ships:
ships[column] = [[column_index, row_index, 0]]
else:
ships[column].append([column_index, row_index, 0])
的输出
board = [
[0, 0, 1],
[0, 0, 1],
[0, 2, 0],
[0, 2, 0],
]
{1: [[2, 0, 0], [2, 1, 0]], 2: [[1, 2, 0], [1, 3, 0]]}
。
提醒一下,指数从0开始。
答案 1 :(得分:1)
使用numpy.nonzero()
和collections.defaultdict
:
from collections import defaultdict
import numpy as np
board = np.asarray(board)
ships = defaultdict(list)
for i, j in zip(*np.nonzero(board)):
ships[board[i, j]].append([i, j, 0])
ships
# defaultdict(list, {1: [[0, 2, 0], [1, 2, 0]], 2: [[2, 1, 0], [3, 1, 0]]})
np.nonzero(board)
在电路板不为零的索引处给出一个(行,列)元组。对于这些(i,j)组合中的每一个,访问板上的相应元素,并将其坐标附加到字典中,并将该值作为键。
np.ndenumerate()
的替代方案:
for (row, col), val in np.ndenumerate(board):
# Introspect this with `list(np.ndenumerate(board))`
if val != 0:
ships[val].append([row, col, 0])
如果您想要Python词典,只需使用dict(ships)
。