Python表格输出

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 
总结:

本项目主要考验列表和字符串的相关方法,要想代码足够简洁,需要掌握列表推导式(也要保持代码的可读性)

  • 13
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值