我有一個變數,代表一個充滿隨機棋子的棋盤。該變數由 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。有人可以提出解決方法嗎?
uj5u.com熱心網友回復:
enumerate行和列。
pieces = []
for i, row in enumerate(chessboard):
for j, piece in enumerate(row):
if piece != " ":
pieces.append((piece, i, j))
uj5u.com熱心網友回復:
回圈enumerate(row)and enumerate(row),如果單元格不是' ',則將索引添加到串列中。這也更有效,因為您的解決方案在每一行回圈多次 - 一次遍歷行,每次它想要找到一塊索引時一次。
uj5u.com熱心網友回復:
使用串列推導:
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)]
uj5u.com熱心網友回復:
這個問題已經有一些很好的答案,但我發現 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)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/477277.html
