动态网格创建

时间:2021-02-05 03:04:07

标签: python

我正在尝试在 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|
+----------------+

我的问题很明显,我的输出不一样但也是 是如何更动态地编码它,无论给出多少列或行,它都会在产生预期网格的地方进行编码,我已经有点硬编码的东西来获得我的输出,我认为这不是最好的方法。< /p>

3 个答案:

答案 0 :(得分:1)

简单易懂:

data = [[1,2,3],[4,5,6],[7,8,9]]

for ind, L in enumerate(data):
    
    if ind == 0:
        print("+"+(("----"*len(L))[:-1])+"+")
    else:
        print("+---"*len(L)+"+")

    for ind2, I in enumerate(L):
        if ind2 == 0:
            print(f"|{I}  ", end="|")
        elif ind2 == len(L)-1:
            print(f"  {I}", end="|")
        else:
            print(f" {I} ", end="|")
    print()
        
    
print("+"+(("----"*len(L))[:-1])+"+")

输出:

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

你也可以使用熊猫:

import pandas as pd

data = [[1,2,3],[4,5,6],[7,8,9]]

df = pd.DataFrame.from_records(data)
pd.set_option("display.max_rows", None, "display.max_columns", None)

print(df)

输出:

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

答案 1 :(得分:1)

试试这个:

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|
+-----+-----+-----+-----+

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

答案 2 :(得分:1)


num_list = [[1,2,3],[4,5,6],[7,8,9]]

def grid_parser(ls):
    width = len(ls[0])
    height = len(ls)
    fin_list = []
    sep_line = '+'+'+'.join(['-----',]*width)+'+'
    fin_list.append(sep_line)
    for line in range(height):
        line_lis = []
        for elem in range(width):
            if elem == 0:
                line_lis.append("{el:<5}".format(el=ls[line][elem]))
            elif elem == width-1:
                line_lis.append("{el:>5}".format(el=ls[line][elem]))
            else:
                line_lis.append("{el:^5}".format(el=ls[line][elem]))
        wh_line = '|'+'|'.join(line_lis)+'|'
        fin_list.append(wh_line)
        fin_list.append(sep_line)
    for i in fin_list:
        print(i)
    
grid_parser(num_list)

输出:

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