table_data = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
def print_table(data):
col_widths = [0] * len(table_data)
num_width = []
for i in range(len(col_widths)): # 判断给定列表中哪个元素最长,并拿出来
col_widths[i] = ' ' # 给他一个空字符串否则无法使用len()函数
for u in range(len(table_data[0])):
if len(col_widths[i]) < len(table_data[i][u]):
col_widths[i] = table_data[i][u]
for i in range(len(col_widths)):
num_width.append(len(col_widths[i]))
for u in range(len(table_data[0])):
print(table_data[0][u].rjust(num_width[0]) + ' ' + table_data[1][u].ljust(num_width[1]) + ' ' + table_data[2][u].ljust(num_width[2]))
print_table(table_data)
这段代码实现了一个打印表格的函数,但是存在一些问题。我会一一说明:
第5行的 len(table_data) 应该改为 len(data),因为在函数中使用的是 data 参数,而不是全局变量 table_data。
第7行的 col_widths 列表初始化应该为 [0] * len(data[0]),而不是 [0] * len(table_data)。因为我们需要统计每列的宽度,而列的数量是数据的第一维度,即 len(data[0])。
第11行中的变量 num_width 应该使用列表推导式来初始化,如 num_width = [len(col) for col in col_widths]。这样可以简化代码并且使代码更易读。
第14行中,table_data 应该改为 data,因为我们要打印的表格数据是传入的 data 参数,而不是全局变量 table_data。
最后一个 print() 语句应该去掉缩进,以便在循环结束后执行,以便打印表格的底部边框。
下面是修改后的代码:
table_data = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
def print_table(data):
col_widths = [''] * len(data[0])
num_width = [len(col) for col in col_widths]
for i in range(len(col_widths)):
for u in range(len(data)):
if len(col_widths[i]) < len(data[u][i]):
col_widths[i] = data[u][i]
num_width[i] = len(data[u][i])
for u in range(len(data[0])):
print(data[0][u].rjust(num_width[0]) + ' ' + data[1][u].ljust(num_width[1]) + ' ' + data[2][u].ljust(num_width[2]))
print()
print_table(table_data)
输出结果:
apples Alice dogs
oranges Bob cats
cherries Carol moose
banana David goose
希望这能帮助您解决问题!