《Python编程快速上手——让繁琐工作自动化 第2版》
6.6 实践项目
6.11.1 表格输出
以下为书中项目介绍:
编写一个名为printTable()的函数,它接收字符串列表的列表,并将列表显示在组织良好的表格中,每列右对齐。假定所有内层列表都包含同样数目的字符串。例如,该值可能看起来像这样:
tableData = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
printTable函数将输出:
apples Alice dogs
oranges Bob cats
cherries Carol moose
banana David goose
提示:你的代码首先爱你必须找到每个内层列表中最长的字符串,这样整列就有足够的宽度以放下所有字符串。你可以将每一列的最大宽度保存在为一个整数的列表。printTable()函数的开始可以是colWidths = [0] * len(tableData),这创建了一个列表,它包含了一些0,数目与tableData中内层列表的数目相同。这样 ,colWidths[0]就可以保存tableData[0]中最长字符串的宽度,colWidths[1]就可以保存tableData[1]中最长字符串的宽度,以此类推。然后可以找到colWidths列表中最大的值,决定将什么整数宽度传递给rjust()字符串方法。
运行代码
def printTable(tabledata: list):
# To save the longest length of an index
colWidths = [0] * len(tabledata)
# To get the longest length of an index
for col_index, column in enumerate(tabledata):
index_element_length = 0
for row_index, row in enumerate(column):
if len(row) > index_element_length:
index_element_length = len(row)
colWidths[col_index] = index_element_length
# print('colWidths:', colWidths)
# Loop printing string
for row_index in range(len(tableData[0])):
for col_index, column in enumerate(tableData):
print(tableData[col_index][row_index].rjust(colWidths[col_index]), end=' ')
print()
tableData = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
printTable(tableData)
运行结果:
apples Alice dogs
oranges Bob cats
cherries Carol moose
banana David goose
该代码是使用书中的建议,在第一行创建 colWidths = [0] * len(tableData) 列表,在后续给列表中元素赋值的方式保存tableData[0]中最长字符串的宽度,总共7行代码。
在下方这篇文章中找到了更为简洁的方法保存tableData[0]中最长字符串的宽度。使用max函数+列表推导式+len函数,仅使用3行代码。
《Python编程快速上手——让繁琐工作自动化》实践项目——打印表格_python编程快速上手 表格打印-CSDN博客
优化后代码
def printTable(tabledata: list):
# Another method to get the longest length of an index
colWidths = []
for i in range(len(tabledata)):
colWidths.append(max(len(j) for j in tabledata[i]))
# print('colWidths:', colWidths)
# Loop printing string
for row_index in range(len(tableData[0])):
for col_index, column in enumerate(tableData):
print(tableData[col_index][row_index].rjust(colWidths[col_index]), end=' ')
print()
tableData = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
printTable(tableData)
运行结果
apples Alice dogs
oranges Bob cats
cherries Carol moose
banana David goose
更简洁的方式是将整个保存tableData[0]中最长字符串的宽度的代码用外部+内部列表推导式的方式实现,仅使用一行代码。
再次优化后代码
def printTable(tabledata: list):
# The simplest way to get the longest length of an index
colWidths = [max(len(item) for item in column) for column in tabledata]
# print('colWidths:', colWidths)
# Loop printing string
for row_index in range(len(tableData[0])):
for col_index, column in enumerate(tableData):
print(tableData[col_index][row_index].rjust(colWidths[col_index]), end=' ')
print()
tableData = [['apples', 'oranges', 'cherries', 'banana'],
['Alice', 'Bob', 'Carol', 'David'],
['dogs', 'cats', 'moose', 'goose']]
printTable(tableData)
运行结果
apples Alice dogs
oranges Bob cats
cherries Carol moose
banana David goose
总结:
本项目主要考验列表和字符串的相关方法,要想代码足够简洁,需要掌握列表推导式(也要保持代码的可读性)