迭代通过多维数组来存储dict中占用位置的索引/坐标,使用值作为键

时间:2018-06-14 17:07:49

标签: python arrays dictionary

我正在使用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])

我不确定为什么它会两次添加相同的坐标。如果它在每行和每列中线性循环,则永远不应再遇到该坐标。

2 个答案:

答案 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)