我有一个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那样写更多的东西,而不是爪哇er(我对此我感到满意)。任何提示/提示/解决方案都将不胜感激!
您可以使用嵌套列表理解和词典,该字典可以帮助您选择索引在路径中或否则为空字符串的情况下选择星。
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)])
和"不可读"一个衬里
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
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")
这是一个更长的版本。您可以简单地使用它,并使用列表comp。