【问题标题】:Formatting the print of a path in 2d grid格式化二维网格中路径的打印
【发布时间】:2017-03-05 19:57:51
【问题描述】:

我有一个二维网格和一条穿过网格的路径,如下所示:

grid = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
path = [(0, 0), (1, 0), (2, 0), (2, 1), (2, 2)]

我想要的结果是一个格式很好的输出,它描绘了带有所示路径的网格:

  *1   2   3
  *4   5   6
  *7  *8  *9

作为 Python 新手,我并不完全知道如何利用列表推导和字符串格式化来发挥自己的优势。

这是我目前所拥有的:

def print_path(grid, path):
    print('\n'.join(''.join(['{:4}'.format(val) for val in row]) for row in grid))

--- Output ---

   1   2   3
   4   5   6
   7   8   9

我在路径中特定元素之前获取星号的想法是将实际的网格元素映射到应该在结果中使用的字符串表示,所以:

1 => "*1"
2 => "2"
...
9 => "*9"

总体而言,Python 的语法让人难以抗拒。我正在尝试写得更像 Python-er 而不是 Java-er(我对此感到满意)。任何提示/提示/解决方案将不胜感激!

【问题讨论】:

    标签: python python-3.x formatting


    【解决方案1】:

    您可以使用嵌套列表推导式和字典来帮助您选择星号,以防索引在您的路径中或为空字符串。

    In [36]: choose = {True: '*', False:''}
    In [37]: print('\n'.join([' '.join(["{}{}".format(choose[(ind, i) in path], j) for i, j in enumerate(sub)]) for ind, sub in enumerate(grid)]))
    *1  2  3
    *4  5  6
    *7 *8 *9
    
    
    #Here is the broken version for more readability:
    
    #'\n'.join([' '.join(
    #          ["{}{}".format(choose[(ind, i) in path], j)
    #           for i, j in enumerate(sub)])
    #    for ind, sub in enumerate(grid)])
    

    【讨论】:

    • 为了可读性,我会分解它。如果其他人曾经试图编辑或添加此内容,他们将很难理解这是什么。 +1 虽然。
    • @AdamSuskin 如果这对您有帮助,请将其标记为正确答案。
    • @PikeD。我试图在接受之前确保我理解它,但是是的,它显然做了它应该做的事情!谢谢!
    【解决方案2】:

    和“不可读”的一个班轮

    def print_path(grid, path):
        print('\n'.join(
                ''.join(['{:4}'.format('*' * ((i,j) in path) + str(val))
                         for j, val in enumerate(row)])
               for i, row in enumerate(grid)))
    
    print_path(grid, path)
    *1  2   3   
    *4  5   6   
    *7  *8  *9
    

    【讨论】:

      【解决方案3】:
      def grid_counter(grid, path):
          for row, row_list in enumerate(grid):
              for column, column_num in enumerate(row_list):
                  if (row, column) in path:
                      print("*"+str(column_num), end=" ")
                  else:
                      print(str(column_num), end=" ")
              print("\n")
      

      这是一个更长的版本。您可以简化它,并使用 list comp。

      【讨论】:

        猜你喜欢
        • 2021-10-17
        • 1970-01-01
        • 1970-01-01
        • 2012-10-01
        • 1970-01-01
        • 2011-07-01
        • 2023-03-04
        • 2012-11-13
        • 1970-01-01
        相关资源
        最近更新 更多