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