首页 > 解决方案 > 动态网格创建

问题描述

我正在尝试在 python 中制作一个二维网格。网格的大小可以变化,但最大的可能是 20 X 20,并且给定列表的内容应打印在每个单元格内,每个单元格的宽度为 4 个字段空间。最左边的单元格中的内容应该左居中,最远的单元格中的内容应该右居中,其余的应该在单元格内居中这是我的代码:

def first(a):
    print('+', end = ' ')
    for i in range(a-1):
        print('%4s%s' %('-','+'), end = ' ')
    print('%4s%s' %('-','+'))

def second(list_):
    for index in list_:
        print('|', end = ' ')
        for num in index:
            print('%s%d%2s|' %('', num, ''), end = ' ')
        print('%4s|' %(''))  

def create_(a,b,list_):
    first(a)
    for i in range(b):
        second(list_)
        first(a)
list_ = [[1,2,3],[4,5,6],[7,8,9]]
create_(3,3,list_)

The output of the code is:
+    -+      -+       -+      -+
|  1  |    2  |   3    |       |
|  4  |    5  |   6    |       |
|  7  |    8  |   9    |       |
.... (this is because it repeats 4 more times)
+    -+      -+       -+      -+
|  1  |    2  |   3    |       |
|  4  |    5  |   6    |       |
|  7  |    8  |   9    |       |
+    -+      -+       -+      -+
And the output that I want is 
+----------------+
|1   |  2  |    3|
+----+-----+-----+
|4   |  5  |    6|
+----+-----+-----+
|7   |  8  |    9|
+----------------+

我的问题显然是,我的输出不一样,但我如何才能更动态地编码它,无论给出多少列或行,它都会产生预期的网格,我已经硬编码了一些东西来获得我的输出不要认为这是最好的方法。

标签: python

解决方案


尝试这个:

def get_row_split(inner_list_):
    return  '+' + '+'.join('-' * 5 for _ in inner_list_) + '+' + '\n'

def get_row(inner_list_):
    cells = []
    for i, _  in enumerate(inner_list_):
        if i == 0:
            cell = "{}    "
        elif i + 1 == len(inner_list_):
            cell = "    {}"
        else:
            cell = "  {}  "
        cells.append(cell)
    return '|' + '|'.join(
        cell.format(str(item)) for cell, item in zip(cells, inner_list_)
    ) + '|' + '\n'


def main():
    list_ = [[1,2,3,4],[4,5,6,6],[7,8,9,8]]
    output = ""
    for inner_list_ in list_:
        output += get_row_split(inner_list_ = inner_list_)
        output += get_row(inner_list_ = inner_list_)
    output += get_row_split(inner_list_ = inner_list_)
    print(output)

if __name__ == "__main__":
    main()

输出:

+-----+-----+-----+-----+
|1    |  2  |  3  |    4|
+-----+-----+-----+-----+
|4    |  5  |  6  |    6|
+-----+-----+-----+-----+
|7    |  8  |  9  |    8|
+-----+-----+-----+-----+

唯一的问题是,如果数字是两位数或更多位数,这将中断。不确定是否有办法解决这个问题。


推荐阅读