如何防止 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 != ' ']
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)]
我有一个变量,代表一个装满随机棋子的棋盘。该变量由 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 != ' ']
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)]