如何在Python 3.6

时间:2017-10-03 04:53:45

标签: python arrays string

谢谢你来到这里。

我正在尝试使用矢量打印“tic - tac - toe”电路板,就像这样

如果我的载体是

b = [0 0 1 0 2 0 0 1 0]

董事会将

[   |   | x ]
[   | o |   ]
[   | x |   ]

另一个例子,如果我的载体是

b = [0 0 0 0 2 1 0 0 2]

董事会将

[   |   |   ]
[   | x | o ]
[   |   | x ]

这意味着如果b [i] = 0,则位置i中的板将是空格,如果b [i] = 1,则位置i中的板将是“x”并且如果b [i] = 2,位置i的电路板将为“o”。

“基础”板是

[ 1 | 2 | 3 ]
[ 4 | 5 | 6 ]
[ 7 | 8 | 9 ]

我尝试过这段代码

def printboard(board):
    a = " "
    for i in range(0,8):
        if board[i] == 0:
            a = a + " "
        elif board[i] == 1:
            a = a + "x"
        elif board[i] == 2:
            a = a + "o"
    print( a[1] + "|" + a[2] + "|" + a[3]
          %"---+---|---"
          %a[4] + "|" + a[5] + "|" + a[6]
          %"---+---|---"
          %a[7] + "|" + a[8] + "|" + a[9])
    return 0

board=np.array([0 ,0 ,1 ,0 ,2 ,0 ,0 ,1 ,0]) 
printboard(board)

但它不起作用。

我认为我的问题在于“打印”,我不知道该怎么做,并且需要用“|”,“ - ”和“+”分隔的板的元素是必要的。就像我试过的那样。

我真的希望有人可以帮助我。非常感谢你(y)

6 个答案:

答案 0 :(得分:1)

我想这就是你想要的

def printboard(board):
    a = []
    for i in range(0,9):
        if board[i] == 0:
            a = a + ["   "]
        elif board[i] == 1:
            a = a + [" x "]
        elif board[i] == 2:
            a = a + [" o "]
    print( a[0] + '|' + a[1] + '|' + a[2]
          +'\n---|---|---'
          +'\n'+a[3] + "|" + a[4] + '|' + a[5]
          +"\n---|---|---"
          +'\n'+a[6] + '|' + a[7] + '|' + a[8])
    return 0

board=np.array([0 ,0 ,1 ,0 ,2 ,0 ,0 ,1 ,0]) 
printboard(board)

你错过了每一行的换行符。此外,a字符串必须替换为数组

答案 1 :(得分:1)

这是另一种方法:

import more_itertools

def print_board(my_list):

    for x in more_itertools.sliced([' ' if x == 0 else 'x' if x == 1 else 'o' for x in my_list], 3):
        print('[ ' + ' | '.join(x) + ' ]')
>>> print_board([0,0,1,0,2,0,0,1,0])
[   |   | x ]
[   | o |   ]
[   | x |   ]

@ 编辑:你喜欢更长的线路吗?当然,没问题:

print('\n'.join('[ ' + ' | '.join(x) + ' ]' for x in __import__('more_itertools').sliced([' ' if x == 0 else 'x' if x == 1 else 'o' for x in my_list], 3)))

答案 2 :(得分:0)

将数组拆分为3并通过将0,1和2替换为各自的字符来构造每个子数组的字符串:

def print_board(lst):
    for i in range(0, len(lst), 3):
        print('[ ' + ' | '.join([(' ', 'o', 'x')[x] for x in lst[i:i+3]]) + ' ]')

b = [0, 0, 0, 0, 2, 1, 0, 0, 2]       
print_board(b)
[   |   |   ]
[   | x | o ]
[   |   | x ]

答案 3 :(得分:0)

你的print电话确实相当混乱。主要问题似乎是您使用%在某些时间和其他时间随机使用+。只有+可用于连接字符串。 %运算符可以与字符串一起使用,但它会执行不同类型的字符串格式化(这可能是此问题的一个选项,但不是到目前为止设置它的方式)。您还没有在打印的字符串中包含任何换行符,因此您可能希望添加这些换行符。

我认为如果您将此print电话替换为此电话,则可以使用:

print(a[1] + "|" + a[2] + "|" + a[3]
      + "\n---+---+---\n"
      + a[4] + "|" + a[5] + "|" + a[6]
      + "\n---+---+---\n"
      + a[7] + "|" + a[8] + "|" + a[9])

您还可以使用print函数的某些功能来处理输出的某些部分(例如换行符。而不是连接所有组件字符串以构建单个输出字符串,'' d将单独的部分作为单独的参数传递给print,并在最后添加sep关键字参数:

print(a[1] + "|" + a[2] + "|" + a[3],
      "---+---+---",
      a[4] + "|" + a[5] + "|" + a[6],
      "---+---+---",
      a[7] + "|" + a[8] + "|" + a[9],
      sep="\n")

请注意,在这两个示例中,我修复了水平线以使用两个+而不是一个+和一个|

答案 4 :(得分:0)

我们可以使用dictionarymap符号来表示值,然后使用numpy将列表转换为N x N matrix,如下所示。

import numpy as np
keymap = {0 : '|' , 1 : 'x', 2: 'o'}
b = [0, 0, 1, 0, 2, 0, 0, 1, 0]
a = np.array([keymap[x] for x in b]).reshape((3,3,))

>>> for i in a:
    print('[ ' + '  '.join(i) + ' ]')


[ |  |  x ]
[ |  o  | ]
[ |  x  | ]

答案 5 :(得分:0)

以下是使用zip和join的交互式演示。

>>> b = '0 0 1 0 2 0 0 1 0'.split(' ')
>>> c = [" xo"[int(e)] for e in b]
>>> d = ['[','|','|',']\n[','|','|',']\n[','|','|',']']
>>> print("".join(["".join(e) for e in zip(d, c+['\n'])]))
[ | |x]
[ |o| ]
[ |x| ]

Try it online!