动态网格创建

2024-10-02 04:24:21 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用python制作2d网格。网格的大小可能会有所不同,但最大的网格可能是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|
+----------------+

我的问题很明显,我的输出不一样,但是 我该如何更动态地编码它,无论它生成了多少列或行,都会生成预期的网格,我已经对一些东西进行了硬编码,以获得我的输出,我认为这不是最好的方法


Tags: in网格内容forisdefrange中心
3条回答

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

简单易懂:

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

试试这个:

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

唯一的问题是,如果数字是两位数或两位数以上,这将中断。不确定是否有办法解释这一点

相关问题 更多 >

    热门问题