使用嵌套列表迭代字典并在板位置打印
Iterating through dictionary with nested lists and printing at board position
我有一个以字符串为键的字典和一个以点坐标为值的列表。
即
dict = {'.' : [[0,0],[0,1]...], 'X': [[0,2], [8,1]...] }
其中 'X' 和 '.'键不包含相同的坐标。
我的问题是遍历它们并在值的位置打印键。我尝试了嵌套的 for 循环,但我不知道如何访问输出终端上的坐标。
我想将我的输出打印到控制台而不是绘制它。
我希望我的输出类似于:
..................X....
XX...........X.........
XXX....................
XXX....X...X...X..X....
.......................
.......................
.......................
我正在使用 python 3
所以如果你有一个代表你的板的二维列表
board = [[' ' for _ in range(9)] for _ in range(9)]
你可以用pprint
来显示,比如
import pprint
pprint.pprint(board)
[[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']]
因此,要执行替换,您可以遍历字典并根据需要替换那些元素
d = {'.' : [[0,0],[0,1]], 'X': [[0,2], [8,1]] }
for k, v in d.items():
for i, j in v:
board[i][j] = k
结果是
>>> pprint.pprint(board)
[['.', '.', 'X', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' ']]
另一种方法是先 "invert" 字典,然后遍历你的坐标并在倒排字典中查找它们。
类似于:
#d1 = {'.' : [[0,0],[0,1]...], 'X': [[0,2], [8,1]...] }
d1 = {'.' : [[0,0],[0,1]], 'X': [[0,2], [8,1]] }
# "Invert" the dictionary
d2 = {}
for (symbol, coords) in d1.items():
for coord in coords:
d2[tuple(coord)] = symbol # Note 1
# Display it (assuming your coordinates go from 0-9 inclusive
for y in range(10):
for x in range(10):
sym = d2.get((x,y), ' ') # Note 2
print(sym, end='') # Note 2
# Print a newline at the end of each row
print()
注1:这里的coord
是一个2元素的列表,但是由于列表不能作为字典的键,所以我把它们转成了元组。
注意 2:这只是必要的,因为示例代码有一个不完整的 d1
字典。如果您的 d1
字典包含所有对,您可以将这两行组合成简单的
print(d2[(x,y)], end='')
注意 3:这里我们为 print
函数指定了一个可选参数,告诉它 不 在打印后添加换行符。
输出看起来有点奇怪:
.
. X
X
(有额外的 space-only 行)但只是因为我的 d1
词典不完整。
最后,您可能会仔细检查所有这些并注意到您的电路板似乎关闭了,就像模式在应该指向正确的时候正在上升。如果是这种情况,您的坐标是 (y,x) 顺序,我假设它们是 (x,y) 顺序。只需更改行
d2.get((x,y), ' ')
至
d2.get((y,x), ' ')
或者,如果您在注释 2 中进行了简化,则更改
print(d2[(x,y)], end='')
至
print(d2[(y,x)], end='')
首先初始化一个用点填充的空板,这可以通过以下方式完成:
board = [['.' for _ in range(8)] for _ in range(8)]
输出为:
[['.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.']]
然而,这不是印刷电路板的巧妙方法,因此在进一步研究之前,我们可以创建一种印刷方法。
这可以通过遍历 rows
并为每个 row
加入该列表来创建一个字符串并像这样打印它来完成:
for r in board:
print(''.join(r))
这个小 for 循环将当前板整齐地打印为:
........
........
........
........
........
........
........
........
要用 dict
中指定的十字替换点,我们真的可以很简单地做(这假设坐标的形式是 [x, y]
):
d = {'.' : [[0,0],[0,1]], 'X': [[0,2], [4,1], [2,5]] }
for c in d['X']:
board[c[1]][c[0]] = 'X'
然后我们可以像以前一样显示棋盘,我们得到:
........
....X...
X.......
........
........
..X.....
........
........
希望这对您有所帮助:)
我只是将坐标存储为键而不是值,除非您有特殊理由这样做。当然你不能使用列表作为键,所以你必须使用元组来代替。
board = {(x, y): '.' for x in range(10) for y in range(10)}
board[(2, 3)] = 'X'
for y in range(10):
for x in range(10):
print(board[(x, y)], end=' ')
print()
输出:
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . X . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
我有一个以字符串为键的字典和一个以点坐标为值的列表。
即
dict = {'.' : [[0,0],[0,1]...], 'X': [[0,2], [8,1]...] }
其中 'X' 和 '.'键不包含相同的坐标。
我的问题是遍历它们并在值的位置打印键。我尝试了嵌套的 for 循环,但我不知道如何访问输出终端上的坐标。
我想将我的输出打印到控制台而不是绘制它。
我希望我的输出类似于:
..................X....
XX...........X.........
XXX....................
XXX....X...X...X..X....
.......................
.......................
.......................
我正在使用 python 3
所以如果你有一个代表你的板的二维列表
board = [[' ' for _ in range(9)] for _ in range(9)]
你可以用pprint
来显示,比如
import pprint
pprint.pprint(board)
[[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ']]
因此,要执行替换,您可以遍历字典并根据需要替换那些元素
d = {'.' : [[0,0],[0,1]], 'X': [[0,2], [8,1]] }
for k, v in d.items():
for i, j in v:
board[i][j] = k
结果是
>>> pprint.pprint(board)
[['.', '.', 'X', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '],
[' ', 'X', ' ', ' ', ' ', ' ', ' ', ' ', ' ']]
另一种方法是先 "invert" 字典,然后遍历你的坐标并在倒排字典中查找它们。
类似于:
#d1 = {'.' : [[0,0],[0,1]...], 'X': [[0,2], [8,1]...] }
d1 = {'.' : [[0,0],[0,1]], 'X': [[0,2], [8,1]] }
# "Invert" the dictionary
d2 = {}
for (symbol, coords) in d1.items():
for coord in coords:
d2[tuple(coord)] = symbol # Note 1
# Display it (assuming your coordinates go from 0-9 inclusive
for y in range(10):
for x in range(10):
sym = d2.get((x,y), ' ') # Note 2
print(sym, end='') # Note 2
# Print a newline at the end of each row
print()
注1:这里的coord
是一个2元素的列表,但是由于列表不能作为字典的键,所以我把它们转成了元组。
注意 2:这只是必要的,因为示例代码有一个不完整的 d1
字典。如果您的 d1
字典包含所有对,您可以将这两行组合成简单的
print(d2[(x,y)], end='')
注意 3:这里我们为 print
函数指定了一个可选参数,告诉它 不 在打印后添加换行符。
输出看起来有点奇怪:
.
. X
X
(有额外的 space-only 行)但只是因为我的 d1
词典不完整。
最后,您可能会仔细检查所有这些并注意到您的电路板似乎关闭了,就像模式在应该指向正确的时候正在上升。如果是这种情况,您的坐标是 (y,x) 顺序,我假设它们是 (x,y) 顺序。只需更改行
d2.get((x,y), ' ')
至
d2.get((y,x), ' ')
或者,如果您在注释 2 中进行了简化,则更改
print(d2[(x,y)], end='')
至
print(d2[(y,x)], end='')
首先初始化一个用点填充的空板,这可以通过以下方式完成:
board = [['.' for _ in range(8)] for _ in range(8)]
输出为:
[['.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.'], ['.', '.', '.', '.', '.', '.', '.', '.']]
然而,这不是印刷电路板的巧妙方法,因此在进一步研究之前,我们可以创建一种印刷方法。
这可以通过遍历 rows
并为每个 row
加入该列表来创建一个字符串并像这样打印它来完成:
for r in board:
print(''.join(r))
这个小 for 循环将当前板整齐地打印为:
........
........
........
........
........
........
........
........
要用 dict
中指定的十字替换点,我们真的可以很简单地做(这假设坐标的形式是 [x, y]
):
d = {'.' : [[0,0],[0,1]], 'X': [[0,2], [4,1], [2,5]] }
for c in d['X']:
board[c[1]][c[0]] = 'X'
然后我们可以像以前一样显示棋盘,我们得到:
........
....X...
X.......
........
........
..X.....
........
........
希望这对您有所帮助:)
我只是将坐标存储为键而不是值,除非您有特殊理由这样做。当然你不能使用列表作为键,所以你必须使用元组来代替。
board = {(x, y): '.' for x in range(10) for y in range(10)}
board[(2, 3)] = 'X'
for y in range(10):
for x in range(10):
print(board[(x, y)], end=' ')
print()
输出:
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . X . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .
. . . . . . . . . .