如何将字符串从循环追加到单个输出行?

时间:2020-06-07 11:42:21

标签: python-3.x numpy loops

因此,我正在尝试制作一个基于文本的connect-4游戏,以更好地了解Python及其实际工作方式。

简短版本

  • 如何将while循环的每个遍历中的打印文本附加到while循环之前的打印输出中
  • 下面显示的两种方法(正在进行的工作和当前成功运行的一种方法)是执行所需输出的更好方法吗?

长版

我正在尝试使用循环系统在每次旋转之后以均匀间隔且美观的格式打印阵列,因此用户在下一轮旋转之前会清楚地知道当前板的外观。 为此,我希望能够使代码行尽可能的小,以使其更易于阅读代码本身。尽管这可能不是执行此方案的最佳实践,但我想更好地理解这种编码方式,以便在需要时将其应用于将来的项目。

就实际执行而言,我试图使用while循环在同一输出行中将数组的7个位置一个接一个地附加到同一行中。之后,我要在“所需的输出”下面的代码中看到的下一行,在上一行的下面打印下一行。

在此先感谢您的回答,建议和意见。

正在进行中

import numpy as np
ARRAY = np.zeros(shape=(6, 7), dtype = 'int8')
# In reality I will be using an empty array that gradually gets populated
# Zeros are used for ease of asking the question

def Display_board():
    i = 0
    while i < 7:
        j = 0
        print("  ", end = " ")
        while j < 8:
            print(str(ARRAY[i][j]))
            j += 1
        i += 1

在制品输出

 0
   0
0
0
0
0
0
0
   0
0
0
0
0
0
0
# It goes on but didn't include as it would take up unnessary space in the question

如果将打印数组的行更改为如下所示,则会得到另一个不需要的输出

print(str(ARRAY[i][j]), end = " ")

#output
  0 0 0 0 0 0 0    0 0 0 0 0 0 0    0 0 0 0 0 0 0    0 0 0 0 0 0 0    0 0 0 0 0 0 0    0 0 0 0 0 0 0

当前工作方法-提供所需的输出

def Display_board():
   for i in range(6):
       print("   " + str(ARRAY[i][0]) + "  " + str(ARRAY[i][1]) + "  " + str(ARRAY[i][2]) \
       + "  " + str(ARRAY[i][3]) + "  " + str(ARRAY[i][4]) + "  " + str(ARRAY[i][5])\
       + "  " + str(ARRAY[i][6]))

所需的输出

  0  0  0  0  0  0  0
  0  0  0  0  0  0  0
  0  0  0  0  0  0  0
  0  0  0  0  0  0  0
  0  0  0  0  0  0  0
  0  0  0  0  0  0  0

3 个答案:

答案 0 :(得分:1)

简单的解决方法是在end=' '的while循环内的打印中使用j,然后在其后添加print()

def Display_board():
    i = 0
    while i < 6:
        j = 0
        print("  ", end = " ")
        while j < 7:
            print(str(ARRAY[i][j]), end=" ")
            j += 1
        print()
        i += 1

输出:

   0 0 0 0 0 0 0 
   0 0 0 0 0 0 0 
   0 0 0 0 0 0 0 
   0 0 0 0 0 0 0 
   0 0 0 0 0 0 0 
   0 0 0 0 0 0 0 

您还可以将嵌套列表推导与join一起使用以在一行中实现输出:

def Display_board():
    print('\n'.join(' '.join(['  '] + [str(ARRAY[i][j]) for j in range(7)]) for i in range(6)))

答案 1 :(得分:1)

最终编辑: 修复了代码实际使用宽度设置的问题!

最终编辑:)

如果数字可以大于9,则可以使用出色的python f字符串格式化选项:

ARRAY = [
    [1, 2, 3, 4, 5],
    [10, 20, 3, 4, 5],
    [1, 2, 30, 4, 5],
    [1, 2, 3, 4, 500],
]

width = 3
for row in ARRAY:
    print(" ".join(f'{x:>{width}}' for x in row))

产生:

  1   2   3   4   5
 10  20   3   4   5
  1   2  30   4   5
  1   2   3   4 500

编辑:

这虽然不那么直观,但更短,并且可以说是更多的Python语言:

for row in ARRAY:
    print(" ".join(map(str, row)))

这将适用于任何阵列:

ARRAY = [
    [1, 2, 3, 4, 5],
    [1, 2, 3, 4, 5],
    [1, 2, 3, 4, 5],
    [1, 2, 3, 4, 5],
]

for row in ARRAY:
    for n in row:
        print(n, end = " ")
    print()

出现:

1 2 3 4 5
1 2 3 4 5
1 2 3 4 5
1 2 3 4 5

已编辑以删除print(“”)中的“”

答案 2 :(得分:1)

具有两个功能

第一个:

def display_board1(board):

    m, n = board.shape

    for i in range(m):
        for j in range(n):
            print(board[i][j], end= ' ')
        print()

    return 1

第二个:

def display_board2(board):

    s = board.__str__()
    s = s.replace('[', ']')
    s = s.replace(']', '')
    s = ' ' + s

    print(s)

    return 1

return 1语句仅用于绘图,如果您不希望它们,请将其删除

这是它们在输入大小方面的表现 display_board2()更快,更稳定

import perfplot

bench = perfplot.bench(
    setup= np.zeros,
    kernels= [
        display_board1,
        display_board2
    ],
    n_range= [(i, i) for i in range(10)],
)

bench.show()

enter image description here