使用嵌套列表迭代字典并在板位置打印

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 . . . . . . . 
. . . . . . . . . . 
. . . . . . . . . . 
. . . . . . . . . . 
. . . . . . . . . . 
. . . . . . . . . . 
. . . . . . . . . .