格式化2d网格

时间:2017-03-05 19:57:51

标签: python python-3.x formatting

我有一个2d网格和一个通过网格的路径,如下所示:

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(我很满意)。任何提示/提示/解决方案将不胜感激!

3 个答案:

答案 0 :(得分:3)

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

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 :(得分:0)

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。

答案 2 :(得分:0)

和"不可读"一个班轮

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