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

时间:2017-09-08 18:07:47

标签: python python-3.x dictionary nested-lists python-3.6

我有一个字典,字符串作为键,列表的坐标为点值。

    dict = {'.' : [[0,0],[0,1]...],  'X': [[0,2], [8,1]...] }

其中'X'和'。'键不包含相同的坐标。

我的问题是迭代它们并在值的位置打印键。我尝试了嵌套的for循环,但我不知道如何访问输出终端上的坐标。

我想将输出打印到控制台而不是绘制它。

我希望我的输出看起来类似于:

..................X....
XX...........X.........
XXX....................
XXX....X...X...X..X....
.......................
.......................
.......................

我正在使用python 3

4 个答案:

答案 0 :(得分:1)

所以如果你有一个代表你的董事会的二维名单

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', ' ', ' ', ' ', ' ', ' ', ' ', ' ']]

答案 1 :(得分:0)

另一种方式是首先"反转"字典,然后循环你的坐标,并在倒置字典中查找它们。

类似的东西:

#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         

(使用额外的仅限空格的行)但仅因为我的d1字典不完整。

最后,你可能会仔细研究所有这些,并注意到你的电路板似乎已关闭,就像模式指向正确时一样。如果是这种情况,你的坐标是(y,x)顺序,我假设它们是(x,y)顺序。只需更改行

即可
d2.get((x,y), ' ')

d2.get((y,x), ' ')

或者,如果您在注2中进行了简化,请更改

print(d2[(x,y)], end='')

print(d2[(y,x)], end='')

答案 2 :(得分:0)

首先初始化一个装有圆点的空白板,这可以通过以下方式完成:

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

希望这会有所帮助:)

答案 3 :(得分:0)

除非你有特殊的理由这样做,否则我只是将坐标存储为关键而不是值。当然,您不能将列表用作键,因此您必须使用元组。

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