假设输入'table'是字符串列表的列表,目标是创建并返回格式化的
表示2D表的字符串。
这是我得到的:
def show_table(table):
new_string = ''
for i in table:
for j in range(len(i)):
line = i[j]
new_string += '| {} '.format(i[j])
new_string += '|\n'
return new_string
当行的间距相等时,我的代码在某些情况下有效。例如:
input: [['A','BB'],['C','DD']]
output: '| A | BB |\n| C | DD |\n'
print:| A | BB |
| C | DD |
但是,当行不相似时:
input: [['10','2','300'],['4000','50','60'],['7','800','90000']]
它导致我的输出不同:
Right_output: '| 10 | 2 | 300 |\n| 4000 | 50 | 60 |\n| 7 | 800 | 90000 |\n'
my_output: '| 10 | 2 | 300 |\n| 4000 | 50 | 60 |\n| 7 | 800 | 90000 |\n'
正确的输出应该是正确的:
| 10 | 2 | 300 |
| 4000 | 50 | 60 |
| 7 | 800 | 90000 |
我的输出:
| 10 | 2 | 300 |
| 4000 | 50 | 60 |
| 7 | 800 | 90000 |
我需要在哪里修改我的代码才能使我的打印输出与正确的输出匹配?我想这是关于列的最大宽度的事情?
答案 0 :(得分:1)
padding带str.format()
字符串(左对齐)的语法如下:
>>> '{:10}'.format('test')
'test '
在打印表格之前,您需要预先计算列的宽度。这会产生正确的输出:
def show_table(table):
new_string = ''
widths = [max([len(col) for col in cols]) for cols in zip(*table)]
for i in table:
for j in range(len(i)):
new_string += '| {:{}} '.format(i[j], widths[j])
new_string += '|\n'
return new_string
答案 1 :(得分:1)
为了获得所需的输出,我将表格元素的最大宽度整合到您的函数中:
def show_table(table):
max_widths = map(max, map(lambda x: map(len, x), zip(*table)))
new_string = ''
for i in table:
for j in range(len(i)):
line = i[j]
line = line + ' '*(max_widths[j]-len(line))
new_string += '| {} '.format(line)
new_string += '|\n'
return new_string
解释max_widths行......
max_widths = map(max, map(lambda x: map(len, x), zip(*table)))
......可以分三步完成:
转置表格的行和列
transposed = zip(*table)
获取所有字符串的长度以进行比较
lengths = map(lambda x: map(len, x), transposed)
获取每列的最大长度
max_widths = map(max, lengths)