如何防止 for 循环在 Python 中添加相同的元素?

How to prevent a for loop from adding the same element in Python?

我有一个变量,代表一个装满随机棋子的棋盘。该变量由 8 个列表组成,每个列表包含 8 个位置,用“”(空位置)或特定棋子(例如“♞”)填充:

chessboard = [
[' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',' ','♞','♞',' '],
[' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ','♔',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' ',' ']
]

我想收集列表中每件作品的信息:

pieces = []
for row in chessboard:
        for piece in row:
            if piece != " ":
                pieces.append((piece, row.index(piece), chessboard.index(row)))

上面的 for 循环几乎可以工作。它有一个问题。如果同一行有多个相同的块,则添加第一个迭代块的坐标:

[('♞', 5, 2), ('♞', 5, 2), ('♔', 2, 5)]

第二个骑士应该在位置6,2。有人可以提出解决方法吗?

循环 enumerate(row)enumerate(row),如果单元格不是 ' ',则将索引添加到列表中。这也更有效,因为您的解决方案多次循环遍历每一行 - 一次遍历该行,并且每次它想要找到一个片段的索引。

enumerate 行和列。

pieces = []
for i, row in enumerate(chessboard):
        for j, piece in enumerate(row):
            if piece != " ":
                pieces.append((piece, i, j))

这个问题已经有一些很好的答案,但我发现 numpy 可能是这个问题的不错选择:

>>> import numpy as np
>>> board = np.array(chessboard)
>>> board
array([[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
       [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
       [' ', ' ', ' ', ' ', '♞', '♞', ' ', ' '],
       [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
       [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
       [' ', ' ', '♔', ' ', ' ', ' ', ' ', ' '],
       [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
       [' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']], dtype='<U1')
>>> i, j = (board != ' ').nonzero()
>>> list(zip(board[i, j], j, i))
[('♞', 4, 2), ('♞', 5, 2), ('♔', 2, 5)]

使用列表理解:

out = [(item, j, i) for i,row in enumerate(chessboard)
                    for j,item in enumerate(row) if item != ' ']

numpy.where:

import numpy as np

a = np.array(chessboard)
i,j = np.where(a!=' ')
out = list(zip(a[i,j], j, i))

输出:

[('♞', 5, 2), ('♞', 6, 2), ('♔', 2, 5)]