【问题标题】:How to append strings from a loop to a single output line?如何将字符串从循环附加到单个输出行?
【发布时间】:2020-09-26 09:32:20
【问题描述】:

所以我正在尝试制作一个基于文本的 connect-4 游戏,以便更好地理解 Python 及其实际工作原理。

短版

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

加长版

我正在尝试使用循环系统在每次转弯后以均匀间隔且美观的格式打印出数组,以便用户在下一次转弯之前清楚地反馈当前电路板的外观。 为此,我希望能够拥有尽可能小的代码行,以便更容易阅读代码本身。尽管这可能不是执行此场景的最佳实践,但我想更好地理解这种编码方式,以便在需要时将其应用于未来的项目。

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

提前感谢您的回答、建议和 cmets。

进行中

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

【问题讨论】:

    标签: python-3.x numpy loops


    【解决方案1】:

    简单的解决方法是在 j 的 while 循环内的 print 上使用 end=' ',然后在其后添加 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)))
    

    【讨论】:

      【解决方案2】:

      想出了两个函数

      第一个:

      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()
      

      【讨论】:

      • 这非常有用,谢谢。在这种情况下,重新升级稳定性是不稳定程序的唯一问题,即完成所需的时间,或者由于这种不稳定可能会出现其他下划线问题吗?
      • 不稳定性仅在执行函数所花费的时间上,这意味着程序的后续运行可能需要不同的时间来执行,但这种差异对于较小的板尺寸来说即使不是微不足道的也不会引起注意,我相信即使电路板尺寸至少为 100 也可以
      【解决方案3】:

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

      最终编辑:)

      如果数字可以大于 9,您可以使用美妙的 python f-string 格式化选项:

      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
      

      编辑:

      这虽然不那么直观,但更短,可以说更pythonic:

      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("") 中的 ""

      【讨论】:

        猜你喜欢
        • 2021-05-17
        • 2022-11-30
        • 2022-01-13
        • 1970-01-01
        • 1970-01-01
        • 2020-07-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多